__if_exists是Microsoft特定的关键字,用于在编译时测试标识符的存在:
msdn:__if_exists
它可以非常方便地使用“伪造的”模板特化,因为在某些情况下,它比“真正的”特化或重载之类的其他方法提供了一种更加简单,易读且性能更好的方式。
但是现在我必须将一个大项目移植到gnu c++,我想如果我不得不(在极少的情况下)找到其他使用这种方法的机会,我会有些哭泣
最佳答案
我认为这是一个糟糕的关键字...
不幸的是,据我所知,它在gcc中并不存在,但是我可能根本不知道。
解决此问题的正确C++方法是通过使用Concepts,即根据某些要求调整在类型上进行的操作。
通常,它是使用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的文档有些欠缺。
关于c++ - gnu c++中的__if_exists是否等效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3779466/