何时使用__if_exists
而不写大量糟糕的代码?
看起来这个关键字就像C预处理器指令,但是在预处理器之后处理。并且IntelliSense不解析它并将代码强调为死或活。这些一起分析用__if_exists
编写的代码真的非常重要。
到目前为止,我发现只有一个相对安全的案例。我们有一个容器类,它接受存储对象的地址。当存储的类有一个重载的operator&
时,会调用重载的运算符,这会导致问题。
所以我添加了以下检查:
__if_exists( T::operator& ) {
static_assert( false );
}
现在,如果operator&
成员函数是存储的类型,代码至少不会编译。
IMO这个用例非常清晰易读。
在没有大量不可读代码的情况下使用__if_exists
还有哪些其他情况?
答案 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>