传递失败的模板参数

时间:2015-02-25 16:15:33

标签: c++ templates parameters undefined enable-if

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;是

1 个答案:

答案 0 :(得分:2)

您正在谈论的undefined类型的最简单方法是:

std::enable_if_t<false>

因此,您可以像这样调用foo模板:

foo<int, std::enable_if_t<false>>(13)

如你所说的那样让它失败。