1

私はこのようなことをしたい...

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() の呼び出しを動的に構築できるかどうかを確認しようとしましたが、うまくいきませんでした。

4

3 に答える 3

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 { /* ... */ }
}
于 2012-10-02T22:30:02.933 に答える
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.
于 2012-10-02T22:30:37.823 に答える
1

ええ、オーバーロードされた関数(上記で指定されたように)

ただし、分岐を行う必要があり、a、b、cの実装を制御する場合は、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); }
于 2012-10-02T22:32:58.433 に答える