允许 class 模板的模板参数在派生的 class 中可见

Allowing class template's template parameters to be visible in the derived class

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

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

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

您可以通过使用可变参数 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 中所见。

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

一样使用它
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;
};