使用__if_exists的好例子是什么?

时间:2011-02-21 14:01:03

标签: c++ visual-c++

何时使用__if_exists而不写大量糟糕的代码?

看起来这个关键字就像C预处理器指令,但是在预处理器之后处理。并且IntelliSense不解析它并将代码强调为死或活。这些一起分析用__if_exists编写的代码真的非常重要。

到目前为止,我发现只有一个相对安全的案例。我们有一个容器类,它接受存储对象的地址。当存储的类有一个重载的operator&时,会调用重载的运算符,这会导致问题。

所以我添加了以下检查:

__if_exists( T::operator& ) {
   static_assert( false );
}

现在,如果operator&成员函数是存储的类型,代码至少不会编译。

IMO这个用例非常清晰易读。

在没有大量不可读代码的情况下使用__if_exists还有哪些其他情况?

2 个答案:

答案 0 :(得分:3)

虽然我不确定这总是可行或有用,但__if_exists可以 在某种意义上用作D语言的static if 例如,以下代码打印b

template< bool > struct static_if_t;
template<> struct static_if_t< true > {};
#define STATIC_IF( c )     __if_exists    ( static_if_t< (c) > )
#define STATIC_UNLESS( c ) __if_not_exists( static_if_t< (c) > )

struct X {
  static bool const v = false;
};

STATIC_IF( X::v ) {
  void f() { puts("a"); }
}
STATIC_UNLESS( X::v ) {
  void f() { puts("b"); }
}

int main() {
  f(); // prints "b"
}

答案 1 :(得分:2)

我认为你可以用它来区分联合和类,因为类确实有构造函数而工会没有。

你想要这个,例如boost::type_traits::is_class<T>boost::type_traits::is_union<T>