具有相同类型参数的类型安全变差函数
type-safe variadic functions with parameters of same type
我想使用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) {
...
}
你可能会抱怨你不能将其用于任意类型,但你需要意识到,你需要告诉某个地方涉及什么类型。。。尽管您需要指定参数类型,但它也可以作为模板。
相关文章:
- 构造函数正在调用一个使用当前类类型的函数
- 如何将元素添加到数组的线程安全函数?
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 仅在函数模板中为那些定义了函数的类型执行函数
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- C++:用户定义的显式类型转换函数错误
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- C++如果采用类类型的函数被传递派生类型,有没有办法给出错误?
- 如何使用类型级函数动态创建静态类型?
- 基于类型作为参数的字符串表示形式具有不同返回类型的函数
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 类型安全可变参数函数
- 如何在具有模板函数的类中使用类型安全的联合(变体)
- 采用迭代器的类型安全模板函数
- 具有相同类型参数的类型安全变差函数
- 如何编写一个可以以类型安全的方式迭代泛型类型的函数
- 将intptr_t传递给期望int类型的函数是否安全?