我想做这样的事......
class A;
class B;
class C;
void a(A);
void b(B);
void c(C);
template<typename T> void f(T t)
{
if (some condition)
a(t)
else if (some other condition)
b(t)
else
c(t);
}
int main()
{
A myA;
B myB;
C myC;
f(myA); // some condition ensures f(myA) only calls a(myA)
f(myB); // some condition ensures f(myB) only calls b(myB)
f(myC); // some condition ensures f(myC) only calls c(myC)
return 0;
}
但这不能编译,因为没有定义(B),a(C),b(A),b(C),c(A),c(B)。
有没有办法解决这个问题?我试图看看是否可以使用std :: function()或std :: bind()来动态地构造对(),b()或c()的调用,但没有运气。
答案 0 :(得分:6)
不要使用模板。使用重载:
void f(A x) { if (some_condition) a(x); }
void f(B x) { if (another_condition) b(x); }
void f(C x) { if (third_condition) c(x); }
如果已在呼叫站点确定了条件,请将其从f
中删除,并将对象保持为本地:
int main()
{
if (some_condition)
{
A myA;
f(myA);
}
else { /* ... */ }
}
答案 1 :(得分:4)
您在寻找模板专业化吗?
template<typename T> void f(T t)
{
// Generic implementation
}
// Specialization for A
template<> void f(A a)
{
// A-specific behavior
}
// Repeat for B and C etc.
答案 2 :(得分:0)
是的,重载功能(如上所述是要走的路)
但是,如果你必须进行分支并控制a,b,c的impl,你可以将(),b()和c()声明为模板函数
template<class X>
void a(X aVar){ // impl of a(A); }
template<class X>
void b(X bVar){ // impl of b(B); }
template<class X>
void c(X cVar){ // impl of c(C); }