允许 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 中所见。
是的,您现在使用的是一个数字,这可能不值得,但它消除了很多样板。如果你真的想要,你甚至可以添加一个 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;
};
我想在继承 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 中所见。
是的,您现在使用的是一个数字,这可能不值得,但它消除了很多样板。如果你真的想要,你甚至可以添加一个 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;
};