c++ - 传递失败的模板参数

标签 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未定义。我可以将“未定义”的名称传递给前面提到的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/

相关文章:

c++ - C++中如何获取函数返回值的地址

c++ - 如何实现可以用void实例化的智能指针?

php - 将参数数组与单个参数传递给 PHP 中的函数?

c++ - 简单 CRTP 案例中没有名为 "XXX"的成员

c++ - 我应该如何进行这种显式特化?

ruby-on-rails - Rails 反斜杠 unescape post 参数

WPF枚举值作为ObjectDataProvider的方法参数

c++ - opengl重新编译显示列表

c++ - 有没有办法使用 C++17 折叠表达式来实现它?

c++ - 无法公开自定义 ctypedef 类的 cython vector