在下面的代码中,将类型推断规则用于模板参数(此问题与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


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

最佳答案

您必须传递参数的十进制类型。使用此宏可以克服语法上的障碍:

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&

09-09 23:14
查看更多