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
未定义。我可以将“未定义”的名称传递给前面提到的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”或其他任何内容传递给第二个参数,以使其在评估该参数时仅无法编译。 (标记为“default case”的参数。)
在我的简单测试中,将任意两个参数传递给 foo
会成功(例如 foo<int, int>(13);
)我想要一个模拟 enable_if_t
效果的参数导致它失败(比如当我们调用 foo<double>(13.0);
时)在我说的例子中调用 foo<in, undefined>(13)
.我只想知道“未定义”是什么。
最佳答案
拥有您正在谈论的 undefined
类型的最简单方法是:
std::enable_if_t<false>
所以你可以这样调用你的foo
模板:
foo<int, std::enable_if_t<false>>(13)
让它按照你的要求失败。
关于c++ - 传递失败的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724017/