2012-03-23 141 views
5

我想使用C++ 11中引入的类型安全可变参数函数,但不适用于不同的类型。 A实施例:具有相同类型参数的类型安全可变参数函数

template<typename T> 
T maxv(T first, T second) { 
    return first > second ? first : second; 
} 

template<typename T, typename ... Rest> 
T maxv(T first, T second, T ... rest) { 
    return maxv(first, maxv(second, rest)); 
} 

类型的所有参数都是相同的,所以它是也许可能写出类似的东西:

struct Point { int x,y; }; 

template<> 
Point maxv(Point first, Point second) { 
    return first.x > second.x ? first : second; 
} 

maxv({1, 2}, {3, 4});   // no problem  
maxv({1, 2}, {3, 4}, {5, 6}); // compile error 

它编译与此错误在mingw的克++ 4.5:

error: no matching function for call to 'maxv(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>)' 

因为他不知道{5, 6}Point类型。解决办法是什么?

+0

请问/ var/variadic/ – 2012-03-23 17:31:52

+1

我不得不问,你的数据真的存储在多个非聚合变量中,像max_element这样的东西不合适吗? – 2012-03-23 17:51:09

+0

不要专门的功能,而是传递一个谓词。 – Xeo 2012-03-23 18:04:20

回答

10

解决方案是而不是使用可变模板!与函数模板一起使用时,它们旨在推导参数的类型。这不是你想要做的:你想让参数采取预期的类型。

我没有大量的实践经验与这一点,但你想使用初始化列表此:

Point maxv(std::initializer_list<Point> list) { 
    ... 
} 

你可能会抱怨说,你不能用任意类型,但然后使用这个你需要意识到你需要告诉某个地方涉及哪种类型。 ...尽管您需要指定参数类型,但它可以作为模板。

相关问题