簡體   English   中英

模板類型扣除失敗?

[英]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>::typeT的映射。

您可以通過將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> { /*...*/ }

直播wandbox示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM