c++函数模板,Int形参问题
C++ Function Template, Int Parameter Question
我很好奇为什么这不起作用:
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);
}
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 通过类的模板形参特化成员模板结构
- 非类型引用形参/实参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- c++:候选模板被忽略:模板形参显式指定的参数无效
- c++中作为形参的指针
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 将右值引用形参强制转换为右值引用
- 给引用形参赋值使对象无效
- 当实参是初始化列表而形参是引用时,重载解析
- const整型模板形参的条件
- 使用作为模板形参提供的基类成员,不带限定符
- 模板类的不同返回类型取决于类的形参
- 模板形参有二义性:无法推断模板实参
- 是否有必要在定义中使用模板形参来引用同一个类?
- c++函数模板,Int形参问题