Dan对此问题的回答:Is There Anything Like a Templatized Case-Statement采用DefaultType
模板参数。
是否有可能传递一些会迫使编译时失败的东西?
例如,鉴于这种模板化的功能:
template <typename T, typename R = enable_if_t<is_integral<T>::value, int>>
R foo(T bar) {return static_cast<R>(bar);}
此代码编译正常:foo(13)
但此代码将失败:foo(13.0)
。
foo(13.0)
在编译时失败的原因是enable_if_t
未定义。是否有#34; undefined&#34;的名称?我可以转到前面提到的DefaultType
?
如果是这样,我应该可以通过调用foo<int, undefined>(13)
并让它失败来测试这一点,如果实际上undefined
是我正在寻找的类型。
修改
显然需要更多解释。
Dan的`static_case可以像这样调用:
template<class T>
typename static_switch<sizeof(T),
int, // default case
static_case<sizeof(char),char>,
static_case<sizeof(short),short>,
static_case<sizeof(long),long>,
static_case<sizeof(long long),long long>>::type foo(T bar){ return reinterpret_cast<decltype(foo(bar))&>(bar);}
我想通过&#34; undefined&#34;或者该第二个参数的任何内容,使其在评估该参数时无法编译 。 (参数标记为&#34;默认情况&#34;。)
在我的简单测试中,将任何两个参数传递给foo
都会成功(例如foo<int, int>(13);
)我想要一个模仿enable_if_t
导致其失败的效果的参数(比如当我们打电话给foo<double>(13.0);
)在示例中我说了foo<in, undefined>(13)
。我只是想知道&#34; undefined&#34;是
答案 0 :(得分:2)
您正在谈论的undefined
类型的最简单方法是:
std::enable_if_t<false>
因此,您可以像这样调用foo
模板:
foo<int, std::enable_if_t<false>>(13)
如你所说的那样让它失败。