【发布时间】:2015-02-26 02:15:18
【问题描述】:
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);}
我想将“未定义”或其他任何内容传递给第二个参数,以使其在评估该参数时仅无法编译。 (参数标记为“默认情况”。)
在我的简单测试中,将任意两个参数传递给foo 都会成功(例如foo<int, int>(13);)在示例中,我说调用foo<in, undefined>(13)。我只想知道“未定义”是什么。
【问题讨论】:
-
您可以使用 Raymond Chen 的答案来设置默认情况(这是模板的非专用版本)。
-
@Jarod42 你说什么我可以通过这里?
foo<int, struct matching_type{}::type>(13); -
如果指定
R,则不再使用 SFINAE。不过,我不确定您想要获得什么。 -
@Jarod42 如果您查看
DefaultType,如果没有其他情况匹配,这就是“失败”。我想在不添加 Dan 的最后编辑的情况下实现失败:stackoverflow.com/revisions/28699568/4 -
我已经阅读了最初的问题,然后你的问题大约三遍,我仍然无法弄清楚你在问什么。你想让
13.0失败吗?你想让13.0工作吗?一些代码展示你想要做什么,你想要失败,以及你希望它如何失败会很棒。
标签: c++ templates parameters undefined enable-if