1
#include <type_traits>

using namespace std;

template<class T, class = typename enable_if<is_same<T, char>::value>::type> // OK
struct A {};

#define ENABLE_IF(expr) class = typename enable_if<expr>::type

template<class T, ENABLE_IF((is_same<T, char>::value))> // OK
struct B {};

template<class T, ENABLE_IF(is_same<T, char>::value)> // warning C4002 and error C1004
struct C {};

int main()
{}

私のコンパイラは VC++ 2013 RC です。

マクロENABLE_IF(x)が期待どおりに動作しません:

警告 C4002: マクロ 'ENABLE_IF' の実際のパラメーターが多すぎて致命的です

エラー C1004: 予期しないファイルの終わりが見つかりました

それでもENABLE_IF((x))うまく動作します。

なんで?

4

1 に答える 1

3

is_same<T, char>::value

中間にコンマがあるため、プリプロセッサはそれをマクロへの 2 つの引数と見なします。

is_same<T,char>::value

于 2013-10-15T05:23:14.760 に答える