模板类型扣除失败
Template type deduction fails?
考虑以下示例。
#include <type_traits>
#include <iostream>
using namespace std;
template <typename T_>
using Integral = typename std::enable_if<std::is_integral<T_>::value,T_>::type;
template <typename T_>
using NotIntegral = typename std::enable_if<!std::is_integral<T_>::value, T_>::type;
template <typename T_>
void printIt(const Integral<T_> &value) { cout << "Integral == " << value << endl; }
template <typename T_>
void printIt(const NotIntegral<T_> &value) { cout << "Non Integral == " << value << endl; }
template <typename T_>
void foo(const T_ &value) { printIt<T_>(value); }
int main(int argc, char** argv)
{
printIt<int>(66); //Must explicitly provide argument type.
//printIt(33); //Compiler error. No overloaded function....????
foo(29.);
return 0;
}
为什么我需要明确设置模板参数的类型?编译器是否应该找出int
类型参数?
为什么我需要明确设置模板参数的类型?
因为这些是未建立的上下文。
想象一下std::enable_if<std::is_integral<T_>::value,T_>
的专业,以便::type
评估其他内容。编译器无法知道从typename something<T>::type
到T
的映射。
您可以通过将std::enable_if
作为返回类型的一部分来实现所需的结果,以便将不匹配的过载被淘汰:
template <typename T>
auto printIt(T x) -> std::enable_if_t<std::is_integral_v<T>, void> { /*...*/ }
template <typename T>
auto printIt(T x) -> std::enable_if_t<!std::is_integral_v<T>, void> { /*...*/ }
live wandbox示例
相关文章:
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如果原型是本地的,则使用流 I/O C++类型约束将失败
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 从具有部分专用化的boost:hana::set中提取类型失败
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 在 static_assert 中使用 std::is_base_of 由于类型不完整而失败
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- 添加类型名会导致程序编译失败
- 模板类型推断失败(std::空作为谓词)
- 为什么类型铸件仅在这句话中失败
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- C++擦除-删除类型推断失败
- 类型检查的编译时失败
- C++模板专用化因非类型参数包而失败
- 有没有一种很好的方法来实现具有默认失败情况的条件类型?
- 为什么使用某些类型特征的模板类型会导致模板扣除失败
- λ类型演绎失败
- static_assert<std::is_floating_point<T>::value, " " ) 由于未使用的模板类型而失败