Шаблон функции C ++, вопрос о параметрах Int - PullRequest
1 голос
/ 26 апреля 2011

Мне было любопытно, почему это не работает:

const int ASSIGN_LEFT = 1;
const int ASSIGN_RIGHT = 2;

template <int AssignDirection>
void map( int& value1, int& value2 );

template<>
void map<ASSIGN_LEFT>( int& value1, int& value2 )
{  value1 = value2; }

template<>
void map<ASSIGN_RIGHT>( int& value1, int& value2 )
{  value2 = value1; }

Когда я пытаюсь использовать эту функцию, она вызывает любую специализацию шаблона, которую я определил первым.Итак, map<ASSIGN_RIGHT> будет вызывать map<ASSIGN_LEFT> в приведенном выше коде, если я не переверну порядок специализации, то он всегда будет вызывать map<ASSIGN_RIGHT>.

int main()
{
   int dog = 3;
   int cat = 4;

   map<ASSIGN_RIGHT>( dog, cat );
   std::cout << "dog= " << dog << ", cat= " << cat << std::endl;
}

Выходные данные

dog= 4, cat= 4

Идея в том, что мне не нужно писать две подпрограммы для ввода / вывода данных из структуры.

Вспомогательный вопрос - я бы хотел сделать "int" над параметром шаблона, но, очевидно, вы не можете выполнить частичную специализацию.Очень хотелось бы найти способ обойти это.

Заранее спасибо.

1 Ответ

5 голосов
/ 26 апреля 2011

Следующее определенно работает. Он также работает вокруг того факта, что вы не можете частично специализировать шаблон функции, если делегировать шаблон функции в специальный шаблон класса:

enum AssignDirection { AssignLeft, AssignRight };

template <typename T, AssignDirection D> 
struct map_impl;

template <typename T>
struct map_impl<T, AssignLeft>
{
    static void map(T& x, T& y) { x = y; }
};

template <typename T>
struct map_impl<T, AssignRight>
{
    static void map(T& x, T& y) { y = x; }
};

// Only template parameter D needs an explicit argument.  T can be deduced.
template <AssignDirection D, typename T>
void map(T& x, T& y)
{
    return map_impl<T, D>::map(x, y);
}
...