2

なぜこれが機能しないのか興味がありました:

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

これは、構造体からデータを入出力するために2つのルーチンを作成する必要がないようにするためです。

補助的な質問-テンプレートパラメータの上に「int」を作成したいのですが、明らかに部分的な特殊化を行うことはできません。それを回避する方法を見つけたいと思います。

前もって感謝します。

4

1 に答える 1

6

以下は間違いなく機能します。また、関数テンプレートを特殊なクラステンプレートに委任することによって、関数テンプレートを部分的に特殊化できないという事実を回避します。

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);
}
于 2011-04-26T03:53:09.830 に答える