C++ 模板成员函数的调用
如果我有课C++ 模板成员函数的调用,c++,templates,C++,Templates,如果我有课 class A { template<class T> void foo(T t); }; 或 a.foo(t) 在第二种变体中,X可能不是t的类型。例如,如果t是一个float,但您说a.foo(t),则不会推导出浮点变量,而是整数变量(如果不存在),并且会发生float-到-int的转换 如果类型相同,则没有区别。但是,在代码的整个生命周期中,人们永远不知道类型是否从未改变。在第二个变体中,X可能不是t的类型。例如,如果t是一个float,但您说a.f
class A {
template<class T>
void foo(T t);
};
或
a.foo(t)
在第二种变体中,
X
可能不是t
的类型。例如,如果t
是一个float
,但您说a.foo(t)
,则不会推导出浮点变量,而是整数变量(如果不存在),并且会发生float
-到-int
的转换
如果类型相同,则没有区别。但是,在代码的整个生命周期中,人们永远不知道类型是否从未改变。在第二个变体中,
X
可能不是t
的类型。例如,如果t
是一个float
,但您说a.foo(t)
,则不会推导出浮点变量,而是整数变量(如果不存在),并且会发生float
-到-int
的转换
如果类型相同,则没有区别。然而,在代码的整个生命周期中,人们永远不知道类型是否从未改变。a.foo(t)
基本上将t
推导出t
的类型。如果这对你没问题,就用这个
a.foo
将强制T
为X
,表达式的正确性现在取决于T
是否可转换为X
。有时,如果希望将t
转换为X
,您希望这样做,但您可以将其编写为a.foo(X{t})
。第二种形式并不完全相同,因为它也允许显式转换。a.foo(t)
基本上将t
推导出t
的类型。如果这对你没问题,就用这个
a.foo
将强制T
为X
,表达式的正确性现在取决于T
是否可转换为X
。有时,如果希望将t
转换为X
,您希望这样做,但您可以将其编写为a.foo(X{t})
。第二种形式并不完全等效,因为它还允许显式转换
a.foo(t)
a.foo<X>(t)