在类模板实例化中携带类型信息

Carrying type information in class template instantiation

本文关键字:类型 信息 实例化      更新时间:2023-10-16

我需要访问用于实例化另一个类的类的类型信息。

具体来说,void Beta<T>::do_something()需要接受用于实例化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;

上面的解决方案工作得很好,但是有没有其他方法可以做到这一点,而不将类型作为类成员别名?是否有更"c++"的方式来做到这一点?

您可以创建一个仅由前向声明和部分专门化组成的类模板。

#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);
}

你的意思是像下面这样(模板'模式匹配')吗?

template<typename T<W, S>>
void Beta<T>::do_something(W, S) {...}

虽然我认为你的问题是完全合法的,但我担心当前的c++不允许这种快捷方式…