問題

次の例を考えてみましょう。

 #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型の引数であることを理解する必要がありますか?

  ベストアンサー

テンプレートパラメータの型を明示的に設定する必要があるのはなぜですか?

これらは非推定コンテキストであるためです。

::typeが他のものと評価するように、特殊なstd::enable_if<std::is_integral<T_>::value,T_>を想像してみてください。コンパイラは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> { /*...*/ }
 

ライブウェンドボックスの例

  同じタグがついた質問を見る

c++c++11templatestypetraitstype-deduction