c++函数模板,Int形参问题

C++ Function Template, Int Parameter Question

本文关键字:形参 问题 Int 函数模板 c++      更新时间:2023-10-16

我很好奇为什么这不起作用:

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"上面的一个模板参数,但显然你不能做部分专门化。我很想找到一个解决办法。

下面的方法绝对有效。它还解决了这样一个事实,即不能通过将函数模板委托给专门化的类模板来部分专门化函数模板:

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