推导确切类型的函数模板参数

时间:2016-03-28 23:02:14

标签: c++ templates c++11 c++14 type-inference

在下面的代码中使用了模板参数的类型推断规则(这个问题是关于C ++ 14的):

#include <iostream>    

template <typename T>
void test(T x)
{
        std::cout << "T x" << std::endl;
}

template <>
void test<int>(int x)
{
        std::cout << "int x" << std::endl;
}

template <>
void test<int &>(int &x)
{
        std::cout << "int &x" << std::endl;
}

int main()
{
        int x = 5;
        int &y = x;

        test(x);
        test(y);

        return 0;
}

规则明确规定引用被丢弃(es explained, for example, here),因此输出

int x
int x

非常期待作为最佳匹配过载。但在某些情况下,输出

int x
int &x

可能是理想的。模板参数类型推导是否有一种方法可以直观地推断出参数的确切类型?

1 个答案:

答案 0 :(得分:3)

你必须传递参数的decltype。使用此宏来克服语法障碍:

namespace detail{
    template <typename T> void test(T){std::cout << "T" << std::endl;}
    template <> void test<>(int){std::cout << "int" << std::endl;}
    template <> void test<>(int&){std::cout << "int&" << std::endl;}
}

#define TEST(x) detail::test<decltype(x)>(x)

现在只需使用参数调用:

TEST(x) // int
TEST(y) // int&