C++:如何对模板函数进行分支

C++: How to branch a template function?

本文关键字:函数 分支 C++      更新时间:2023-10-16

我想做这样的事情...

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;
}

但这不能编译,因为没有定义

a(B),a(C),b(A),b(C),c(A),c(B)。

有没有办法解决这个问题? 我试图看看 std::function() 或 std::bind() 是否可以用来动态构造对 a()、b() 或 c() 的调用,但没有运气。

不要使用模板。使用重载:

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 { /* ... */ }
}

您是否正在寻找模板专业化?

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.

是的,重载函数(如上所述是要走的路)

但是,如果您必须进行分支并控制 a,b,c 的 impl,则可以将 a()、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); }