2016-03-28 90 views
0

在下面的代碼使用類型推理規則模板參數(此問題是關於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 

可能是可取的。有沒有一種方法可以通過模板參數類型推導來直觀推斷參數的確切類型?

+0

你所說的「直覺」中的最後一句是什麼意思?編譯器不直接運行 –

+0

我不確定你在問什麼,但也許[這個最近的線程](http://stackoverflow.com/questions/36050087/how-to-distiguish-between-an-rvalue和-rvalue-reference-in-a-function-parameter /)將有所幫助 –

回答

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& 
相關問題