具有不同模板参数的函数返回类型
function return type with a different template parameter
我有一些C++类,它们都具有相同的模板参数
template <typename T, size_t i>
struct A {
};
template <typename T, size_t i>
struct B : A<T,i>{
};
template <typename T, size_t i>
struct C : A<T,i>{
};
等等。我还有一系列方法可以处理这些类中的任何一个。但是,问题出在返回类型中。我希望此方法返回传入类的实例,整数递减 1。例如,如果我只是重载函数,那看起来像这样
template <typename T, size_t i>
A<T,i-1> func(const A<T,i> & a){
}
template <typename T, size_t i>
B<T,i-1> func(const B<T,i> & a){
}
template <typename T, size_t i>
C<T,i-1> func(const C<T,i> & a){
}
有没有办法在不重载每种类型的函数的情况下完成此操作?我的意思是...是否可以用单个模板化函数替换这些函数?所有函数的逻辑都是相同的。
我想那看起来像
template <typename P, size_t i>
P<i-1> func( const P<i> & p ){
}
其中P
以某种方式捕获了原始类型A
、B
或C
,以及内部类型T
。
或者,如果您认为 CRTP 是要走的路,那么我将如何构建它?
听起来您需要使用模板模板参数。这些模板参数本身就是类模板。在下面的示例中,P
是一个模板参数,它需要一个类模板,其中该类模板需要一个类型参数,后跟一个size_t
参数(例如您提供的类模板A
、B
或C
(:
template<template<class, size_t> class P, class T, size_t i>
P<T, i - 1> my_func(const P<T, i> & my_P);
int main()
{
A<int, 10> a;
B<char, 3> b;
C<double, 7> c;
auto smaller_a = my_func(a); // is a A<int, 9>
auto smaller_b = my_func(b); // is a B<char, 2>
auto smaller_c = my_func(c); // is a C<double, 6>
}
由于您没有解释您的函数实际上应该做什么,我只是提供了函数声明并省略了定义。
C++11 编译演示:https://godbolt.org/g/zpXVEb
我通常不使用模板模板语法。 如果模板类型定义是递归的,我宁愿坚持老派的方式:
template<typename T, int I>
struct A{
using Other=A<T,I-1>;
};
template<typename P>
typename P::Other f(P);
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类