传递失败的模板参数

Pass a Failing Template Argument

Dan's answer to this question: 采用 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未定义。是否有 "undefined" 的名称可以传递给上述 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);}

我想将 "undefined" 或其他任何内容传递给第二个参数,以使其在评估该参数时无法编译 only。 (标有"default case"的参数。)

在我的简单测试中,将任何两个参数传递给 foo 都会成功(例如 foo<int, int>(13);)我想要一个参数来模仿 enable_if_t 导致它失败的效果(就像我们调用 foo<double>(13.0); 时一样)在示例中我说调用 foo<in, undefined>(13)。我只想知道 "undefined" 是什么。

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

std::enable_if_t<false>

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

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

并按照您的要求让它失败。