Вызов различных функций в зависимости от параметра шаблона c ++ - PullRequest
4 голосов
/ 01 июня 2010

Я хочу что-то подобное

class A
{
public:
    Array& operator()()
    { . . . }
};

class B
{
public:
    Element& operator[](int i)
    { ... }
};

template<class T>
class execute
{
public:
    output_type = operator()(T& t)
    {
        if(T == A)
            Array out = T()();
        else
        {
            Array res;
            for(int i=0 ; i < length; ++i)
                a[i] = t[i];
        }
    }
};

Здесь есть две проблемы:

  1. мета-функция, заменяющая if-else в операторе execute ()
  2. тип возвращаемого оператора execute ()

Спасибо в ожидании,

Noman

Ответы [ 2 ]

3 голосов
/ 01 июня 2010

Просто специализируйте шаблон класса.

template<class T>
class execute
{};

template<>
class execute<A>
{
 A operator()(A& t)
 {
   /* use A, return A */
 }
};

template<>
class execute<B>
{
 B operator()(B& t)
 {
   /* use B, return B */
 }
};
2 голосов
/ 01 июня 2010

Просто перегрузите оператора:

// used for As
Array operator()(A& a)
{
  // ... 
}

// used for everything else
typename T::Element operator()(T& t)
{
  // ... 
}

Если вам просто нужны A и B, вторая также может относиться к B:

// used for Bs
B::Element operator()(B& b)
{
  // ... 
}
...