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

标签 c++ templates generic-programming

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

特别是void Beta<T>::do_something()需要接受 W, S 类型的参数用于实例化类 Alpha<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);
}

关于c++ - 在类模板实例化中携带类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32434089/

相关文章:

Java:扩展数组大小,似乎无法将所有值保留在原始位置

c++ - 可变参数模板与使用元组在参数中添加不同的数据对

c++ - 内联友元函数的范围是什么?

c++ - Windows api 中是否有 O(1) 方式来连接 2 个文件?

c++ - 从通用外部类返回指向嵌套内部类的指针

c++ - 如果方法不进行类型检查,为什么 C++ 模板会匹配?

c++ - 我如何读写 float 组?

c++ - DirectShow - 将 IGraphBuilder * 转换为 double (C++)

amazon-web-services - 如何使用带有Terraform的AWS启动模板启动AWS EC2实例?

java - 将泛型对象转换为泛型类