从其模板参数之一推导出 parent 的完整类型

Deduce complete type of parent from one of its template parameters

我想获取具有特定模板参数(键)的 parent 的类型名称。

例如,如果我有一个 parent MyParent<int, 1>,我希望能够从我的 child 中得到那个类型(MyParent<int, 1>),只需要 '1 '.如果我有 MyParent<float,2>,我希望能够仅使用 '2' 来获得该类型 (MyParent<float, 2>)。

基本上,我想从“键”(1、2、3 等)中获取类型名称(MyParent、MyParent 等)

我在 C++20 模式下使用 MSVC 编译器。

下面的工作代码正是这样做的(但它有一个缺点):

#include <iostream>

template<std::size_t key>
class KeyClass {};

template<class Type, std::size_t key>
class parent
{
    using keyclass = KeyClass<key>;
    using self = parent<Type, key>;
public:
    template<std::same_as<keyclass> T>
    static self GetType() {}
};

class test :
    public parent<int, 1>,
    public parent<float, 2>
{
public:
    using parent<int, 1>::GetType;
    using parent<float, 2>::GetType;
};

int main()
{
    std::cout << typeid(decltype(test::GetType<KeyClass<1>>())).name() << std::endl;
    std::cout << typeid(decltype(test::GetType<KeyClass<2>>())).name() << std::endl;
}

这会按预期打印:“class parent class parent”。我可以自由地使用这些类型,获取它们的静态成员并用它们做其他事情,这正是我想要的。

缺点是我必须明确指定我正在使用每个 parent 中的 GetType 方法。这很蹩脚,因为我必须输入两次所有内容(继承一​​次,然后指定 'using')。想象一下有几十把钥匙......

有没有其他方法可以在不重复我的代码的情况下做到这一点?例如,有没有什么方法可以在一行中以某种方式为 all 和 parent 指定“使用 GetType”?或者让它们自动继承什么的,这样我就不必指定 'using' 了?

或者也许有不同的方法来做我想做的事情(从某个键(模板参数)获取 compile-time 处的类型,例如 1 应该 return Myparent<int, 1> , 2应该returnMyParent<int, 2>)?

我不想为此使用预处理器。

为了避免必须为每个父 class 的成员编写 using 声明,您可以编写一个可变的 class 模板包装器,为所有公开该成员类型(如显示的重载器模式 here

template<typename... Ts>
struct Bases : Ts...
{
    using Ts::GetType...; 
};

现在您的 test class 可以从这个包装器继承为

class test : public Bases<parent<int, 1>, 
                          parent<float, 2>>
{};

这是一个demo