class模板实例化携带类型信息
Carrying type information in class template instantiation
我需要从一个 class 访问类型信息 我曾经实例化另一个 class。
具体来说 void Beta<T>::do_something()
需要接受用于实例化 class Alpha<W, S>
.
类型 W, S
的参数
template<typename W, S>
class Alpha {
public:
using carry_W = W;
using carry_S = S;
};
template<typename T>
class Beta {};
template<typename T>
void Beta<T>::do_something(typename T::carry_W p1, typename T::carry_S p2) {}
Beta<Alpha<int, double>> b;
上面的解决方案工作正常,但是有没有其他方法可以做到这一点而不将类型别名为 class 成员?还有更多 "C++" 的方法吗?
你的意思是像下面这样的(模板'pattern matching')吗?
template<typename T<W, S>>
void Beta<T>::do_something(W, S) {...}
虽然我认为你的问题是完全合法的,但我担心当前的 C++ 不允许这种快捷方式...
您可以创建一个 class 仅包含前向声明和部分特化的模板。
#include <iostream>
using namespace std;
template<typename W, typename S>
class Alpha {
};
template<typename>
class Beta;
template<typename W, typename S, template<typename, typename> class T>
class Beta<T<W,S>> {
public:
void do_something(W w, S s) {
cout << w << ", " << s << '\n';
}
};
int main() {
Beta<Alpha<int, double>> b;
b.do_something(0, 0.0);
}
我需要从一个 class 访问类型信息 我曾经实例化另一个 class。
具体来说 void Beta<T>::do_something()
需要接受用于实例化 class Alpha<W, S>
.
W, S
的参数
template<typename W, S>
class Alpha {
public:
using carry_W = W;
using carry_S = S;
};
template<typename T>
class Beta {};
template<typename T>
void Beta<T>::do_something(typename T::carry_W p1, typename T::carry_S p2) {}
Beta<Alpha<int, double>> b;
上面的解决方案工作正常,但是有没有其他方法可以做到这一点而不将类型别名为 class 成员?还有更多 "C++" 的方法吗?
你的意思是像下面这样的(模板'pattern matching')吗?
template<typename T<W, S>>
void Beta<T>::do_something(W, S) {...}
虽然我认为你的问题是完全合法的,但我担心当前的 C++ 不允许这种快捷方式...
您可以创建一个 class 仅包含前向声明和部分特化的模板。
#include <iostream>
using namespace std;
template<typename W, typename S>
class Alpha {
};
template<typename>
class Beta;
template<typename W, typename S, template<typename, typename> class T>
class Beta<T<W,S>> {
public:
void do_something(W w, S s) {
cout << w << ", " << s << '\n';
}
};
int main() {
Beta<Alpha<int, double>> b;
b.do_something(0, 0.0);
}