【发布时间】:2013-08-03 02:16:52
【问题描述】:
假设我有一个模板函数 foo(),它接受两个整数引用作为参数。我希望模板函数也能自动处理常量引用(例如来自常量的引用)。这是一个通用的例子。我可以让 foo() 工作,但我必须为引用/常量引用参数的每个排列提供一个新的实现。
#include <iostream>
using namespace std;
template<typename A, typename B>
void foo(A& a, B& b)
{
cout<<"a:"<<a<<" b:"<<b<<endl;
}
template<typename A, typename B>
void foo(A& a, const B& b)
{
cout<<"a:"<<a<<" b:"<<b<<endl;
}
template<typename A, typename B>
void foo(const A& a, B& b)
{
cout<<"a:"<<a<<" b:"<<b<<endl;
}
template<typename A, typename B>
void foo(const A& a, const B& b)
{
cout<<"a:"<<a<<" b:"<<b<<endl;
}
int main()
{
int x = 0;
foo(x, x);
foo(x, 10);
foo(10, x);
foo(20, 20);
return 0;
}
上面的例子有点做作,但它是对我正在尝试做的事情的概括。在我更复杂的情况下,我有一个类作为一组参数的包装器。类构造函数是模板化的,如 foo(),可以有多达 10 个参数。枚举所有 2^10 个可能的构造函数将是一场噩梦。
【问题讨论】:
-
我承认自己不是专家,但这个问题听起来与完美转发有着惊人的关联(排列在那个方向上是一个不那么微妙的暗示)。 this question 的主要答案中有一个非常扎实的讨论,您可能值得一看。
标签: c++ templates metaprogramming template-meta-programming