gpt4 book ai didi

c++ - 模板类型推导失败?

转载 作者:可可西里 更新时间:2023-11-01 18:26:11 26 4
gpt4 key购买 nike

考虑以下示例。

#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 类型的参数吗?

最佳答案

Why do I need to explicitly set the type of template parameter?

因为这些是non-deduced contexts .

想象专业 std::enable_if<std::is_integral<T_>::value,T_>这样::type评估其他东西。编译器无法知道来自 typename something<T>::type 的映射至 T .

您可以通过放置 std::enable_if 来实现您想要的结果作为返回类型的一部分,以便不匹配的重载被 SFINAEd 淘汰:

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 example

关于c++ - 模板类型推导失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46151662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com