【问题标题】:Carrying type information in class template instantiation在类模板实例化中携带类型信息
【发布时间】:2015-09-07 08:21:50
【问题描述】:

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

具体来说,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++”的方式来做到这一点?

【问题讨论】:

标签: c++ templates generic-programming


【解决方案1】:

您可以创建一个仅包含前向声明和部分特化的类模板。

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

【讨论】:

  • 是的,但它只会匹配特定的模板。
  • @FlorinGogianu Ah K,我虽然这是针对某些特定的Alpha
  • 我想这是我们得到的最好的。谢谢!
  • @FlorinGogianu,我有什么办法可以为你扩展这个吗?这似乎与您的问题完全匹配。
  • 我想我明白了。将您的回答标记为答案。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,我猜是这样。我之所以问,是因为我写它的方式在我看来有点 hack,我不确定这是否是公认的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多