Matthieu M...
5
在我看来,这是一个糟糕的关键词......
不幸的是,据我所知,它并不存在于gcc中,但我可能根本就不知道它.
正确的C++处理方法是通过使用Concepts,即根据某些要求调整类型上的操作.
通常,它是通过traits而不是真实的概念来实现的,因为它更容易实施:
template
struct has_dump: boost::mpl::false_ {};
然后通过专门化has_dump结构来转储启用类型.
最简单的是定义3个方法,一个用于路由,另外两个用于执行不同的分支:
template
void dump(T& t, boost::mpl::true_ const& dummy)
{
t.Dump();
}
template
void dump(T& t, boost::mpl::false_ const& dummy)
{
std::cout << typeid(T).name() << " does not have Dump\n";
}
template
void dump(T& t) { dump(t, has_dump()); }
类型特征的另一个用途是与enable_if设施一起使用:
template
typename boost::enable_if< has_dump >::type dump(T& t)
{
t.Dump();
}
// disable_if exists too...
这里,如果类型没有has_dump启用,则可以获得编译时错误,而不是运行时错误消息,不确定是否需要.
然而,这两种方法都非常麻烦,因为检测不是自动化的.这就是Boost.Concept库的原因.
我们的想法是,检查将由一个Concept对象执行,该对象是为了测试需求而创建的,因此您不必再专门化特征,这使得开发更容易.但是我总是发现Boost.Concept的文档有点缺乏.
好吧,出于我的目的,您的选择也太复杂了,但是如果几天之内没人提出真正简单的“是”,我将接受您的回答为“否”。 (2认同)