我很好奇为什么这不起作用:
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”设置在模板参数之上,但显然你不能进行部分专业化。很想找到解决方法。
提前致谢。
答案 0 :(得分:5)
以下绝对有效。它还可以通过将函数模板委托给专用的类模板来实现函数模板的部分特化:
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);
}