在我看来,这是一个蹩脚的关键字......
不幸的是,据我所知,它不存在于 gcc 中,但我可能根本不知道它。
处理此问题的正确 C++ 方法是通过使用概念,即根据某些要求调整对类型进行的操作。
通常,它是通过traits
而不是真正的概念,因为它更容易实施:
template <typename T>
struct has_dump: boost::mpl::false_ {};
然后你通过专门化来转储启用你的类型has_dump
结构。
最简单的是定义 3 个方法,一个用于路由,另外两个用于执行不同的分支:
template <typename T>
void dump(T& t, boost::mpl::true_ const& dummy)
{
t.Dump();
}
template <typename T>
void dump(T& t, boost::mpl::false_ const& dummy)
{
std::cout << typeid(T).name() << " does not have Dump\n";
}
template <typename T>
void dump(T& t) { dump(t, has_dump<T>()); }
类型特征的另一种用途是与enable_if
设施:
template <typename T>
typename boost::enable_if< has_dump<T> >::type dump(T& t)
{
t.Dump();
}
// disable_if exists too...
在这里,如果类型没有,您可以获得编译时错误,而不是运行时错误消息has_dump
已启用,不确定是否是您想要的。
然而,这两种方法都非常麻烦,因为检测不是自动化的。这就是 Boost.Concept 库的存在。
这个想法是,检查将由一个 Concept 对象执行,该对象是为了测试需求而创建的,因此您不必再专门化特征,这使得开发变得更容易。然而我一直发现 Boost.Concept 的文档有些缺乏。