【问题标题】:Pass a Failing Template Argument传递失败的模板参数
【发布时间】: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&lt;int, undefined&gt;(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&lt;int, int&gt;(13);)在示例中,我说调用foo&lt;in, undefined&gt;(13)。我只想知道“未定义”是什么。

【问题讨论】:

  • 您可以使用 Raymond Chen 的答案来设置默认情况(这是模板的非专用版本)。
  • @Jarod42 你说什么我可以通过这里? foo&lt;int, struct matching_type{}::type&gt;(13);
  • 如果指定R,则不再使用 SFINAE。不过,我不确定您想要获得什么。
  • @Jarod42 如果您查看DefaultType,如果没有其他情况匹配,这就是“失败”。我想在不添加 Dan 的最后编辑的情况下实现失败:stackoverflow.com/revisions/28699568/4
  • 我已经阅读了最初的问题,然后你的问题大约三遍,我仍然无法弄清楚你在问什么。你想让13.0 失败吗?你想让13.0 工作吗?一些代码展示你想要做什么,你想要失败,以及你希望它如何失败会很棒。

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


【解决方案1】:

拥有您所说的undefined 类型的最简单方法是:

std::enable_if_t<false>

所以你可以像这样调用你的foo 模板:

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

按照你的要求让它失败。

【讨论】:

  • 很高兴你明白了。这可能是正确的答案。有什么我应该在上面写的能让你更清楚的吗?
  • @JonathanMee 是的,undefined 类型实际上不是类型。这是一个无法评估的模板表达式,因为您寻找不存在的东西,如果它是像 javascript 这样的动态语言,肯定会是 undefined 但在像 c++ 这样的静态类型编译语言中,甚至引用它都是错误的作为undefined 类型,它应该被视为non evaluable 模板表达式。
猜你喜欢
  • 2019-11-13
  • 2021-11-24
  • 2018-02-28
  • 2017-03-05
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多