我有重載函數調用操作符與模板功能,像這樣一類:傳遞到模板函數調用操作符重載參考
class Test
{
public:
template<class T>
void operator()(T t)
{
std::cout<<(&t)<<std::endl;
};
};
我想用一個引用參數來調用它。然而,當試圖這樣做時,它會將參數作爲值傳遞。這是我的測試設置:
template<class T>
void test(T t) {std::cout<<(&t)<<std::endl;}
int main(int argc,char *argv[])
{
Test t;
int i = 5;
std::cout<<(&i)<<std::endl;
t((int&)i); // Passes the argument as a value/copy?
test<int&>(i); // Passes the argument as a reference
while(true);
return 0;
}
輸出是:
地址的輸出0110F738 - 模板參數的地址的輸出 - 「我」
0110F664地址的輸出過載
0110F738 - 參數的通過 '測試'
模板函數'test'僅用於驗證。
Visual Studio調試證實,它使用 '詮釋',而不是 '廉政&' 爲模板超載:
test_function_call.exe測試::運算符()(INT T)9號線C++
我該如何強制它使用引用呢?有沒有辦法在模板函數調用操作符上使用<>來指定類型?
你想'void運算符()(續T&T)' –
我通過
std::ref
包裝,而不是簡單示例轉發不希望它是'常量',我仍然需要能夠修改值。 – Silverlan