【问题标题】:Allowing class template's template parameters to be visible in the derived class允许类模板的模板参数在派生类中可见
【发布时间】:2020-01-30 01:05:06
【问题描述】:

我想在继承类模板时保留其参数参数的可见性。基类将有大量的模板参数,所以我不想在派生类模板中一直要求那些。使用类型别名是唯一的方法吗?

例如,这不起作用,但如果我将所有内容换成注释行,它就会起作用:

#include <iostream>

template<typename one, typename of, typename very, typename many, typename tparams>
class first {
// public:
//  using A = one; //needs to be uncommented to work
};

template<typename class_instance>
class second : public class_instance {
    typename class_instance::one m_data;
    //typename class_instance::A m_data; // would work if we uncommented
};


int main() {

    second<first<int,int,int,int,int>> thing;

    return 0;
}

【问题讨论】:

  • 基本上,是的。模板参数名称仅在模板扩展中可见。如果您希望它在此之外可见,则需要自己执行(通过为其创建类型别名)。

标签: c++ templates inheritance class-template


【解决方案1】:

您可以使用可变参数template template parameter 来简化操作。将second 更改为

template<template<typename...> typename class_instance, typename... Params>
class second  {
public:
    template <std::size_t I>
    using param_t = std::tuple_element_t<I, std::tuple<Params...>>;
    param_t<1> foo;
};

你可以像这样使用它

int main() {
    second<first, int, double, float, long, long long> foo{};
    foo.foo = 42.1;
    std::cout << foo.foo;
}

哪个输出

42.1

正如您在live example 中看到的那样。

是的,您现在使用的是一个数字,这可能不值得,但它消除了很多样板。如果你真的想要,你甚至可以将 enum 添加到 second 并像这样使用它

template<template<typename...> typename class_instance, typename... Params>
class second  {
public:
    enum { one, of, very, many, tparams };
    template <std::size_t I>
    using param_t = std::tuple_element_t<I, std::tuple<Params...>>;
    param_t<of> foo;
};

【讨论】:

  • 谢谢。我更清楚您可以使用tuples 做什么
  • @lakeweb 没问题。 TMP 中经常使用元组。
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多