具有相同类型参数的类型安全变差函数

type-safe variadic functions with parameters of same type

本文关键字:类型安全 函数 类型参数      更新时间:2023-10-16

我想使用C++11中引入的类型安全的可变函数,但不能与不同的类型一起使用。例如:

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 g++4.5:中编译时出现此错误

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

因为他不知道CCD_ 1是CCD_。解决方案是什么?

解决方案是而不是使用可变模板!当与函数模板一起使用时,它们用于推导参数的类型。这不是您想要做的:您希望参数采用预期的类型。

我在这方面没有太多的实践经验,但你想使用初始化器列表:

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

你可能会抱怨你不能将其用于任意类型,但你需要意识到,你需要告诉某个地方涉及什么类型。。。尽管您需要指定参数类型,但它也可以作为模板。