__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/

10-11 18:23