次のように、関数呼び出し演算子をテンプレート関数でオーバーロードするクラスがあります。
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 -- 'i' のアドレスの出力
0110F664 -- テンプレート オーバーロードの引数のアドレスの出力
0110F738 -- 'test' による引数のアドレスの出力
テンプレート関数 'test' は単に検証用です。
Visual Studio デバッガーは、テンプレートのオーバーロードに 'int&' ではなく 'int' を使用していることを確認します。
test_function_call.exe!Test::operator()(int t) 9 行目 C++
代わりに参照を使用するように強制するにはどうすればよいですか? テンプレート関数呼び出し演算子で <> を使用して型を指定する方法はありますか?