我目前正在清理一个充满功能模板的API,并且强烈要求编写下面的代码。需要默认参数值的模板函数的首选设计是什么?
template <typename T, typename U, typename V>
void doWork(const T& arg1, const U& arg2, V* optionalArg = 0);
当我调用这个模板时,我想这样做如下。
std::string text("hello");
doWork(100, 20.0, &text);
doWork('a', text); // oops!
doWork<char, std::string, void>('a', text); // to verbose!
不幸的是,由于编译器无法推断出可选参数的类型,所以第二次调用不能编译。这是不幸的,因为我真的不在乎参数类型是什么,而是它的值是NULL。另外,我想避免第三次调用的路由,因为它妨碍了可读性。
这使我试图使模板参数V
有一个默认类型,这也不起作用,因为您不能将默认类型应用于函数模板参数(至少使用VC++ 9.0)。
template <typename T, typename U, typename V = void> // oops!
void doWork(const T& arg1, const U& arg2, V* optionalArg = 0);
我唯一的选择是引入近朱者赤模板实参V
的doWork
过载。
template <typename T, typename U>
void doWork(const T& arg1, const U& arg2)
{
doWork(arg1, arg2, 0);
}
template <typename T, typename U, typename V>
void doWork(const T& arg1, const U& arg2, V* optionalArg);
这是解决此问题的最佳方法吗?我看到的唯一缺点是,如果函数模板包含许多具有合适默认值的参数,我可能会引入许多简单的转发函数。
是的,你是对的。应在转发功能中指定'0'的类型。 (FR) – 2009-10-12 17:38:58