从其模板参数之一推导出 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>
)?
我不想为此使用预处理器。
我想获取具有特定模板参数(键)的 parent 的类型名称。
例如,如果我有一个 parent MyParent<int, 1>
,我希望能够从我的 child 中得到那个类型(MyParent<int, 1>
),只需要 '1 '.如果我有 MyParent<float,2>
,我希望能够仅使用 '2' 来获得该类型 (MyParent<float, 2>
)。
基本上,我想从“键”(1、2、3 等)中获取类型名称(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
缺点是我必须明确指定我正在使用每个 parent 中的 GetType
方法。这很蹩脚,因为我必须输入两次所有内容(继承一次,然后指定 'using')。想象一下有几十把钥匙......
有没有其他方法可以在不重复我的代码的情况下做到这一点?例如,有没有什么方法可以在一行中以某种方式为 all 和 parent 指定“使用 GetType”?或者让它们自动继承什么的,这样我就不必指定 'using' 了?
或者也许有不同的方法来做我想做的事情(从某个键(模板参数)获取 compile-time 处的类型,例如 1 应该 return Myparent<int, 1>
, 2应该returnMyParent<int, 2>
)?
我不想为此使用预处理器。