作为模板参数的值(任何类型)的列表

List of values (of any types) as a template argument

本文关键字:任何 类型 列表 参数      更新时间:2023-10-16

我的类有一个静态constexpr成员函数get,我需要它返回一个指针,指向由模板参数生成的任意结构的第一个元素(声明的char key;)。

这就是我所拥有的:

template <char id, typename DataType, int... args>
struct MyStruct {
static constexpr DataType member { id, args... };
static constexpr void *get() {
return(&member.key);
}
};

只要DataType的所有成员(在第一个成员之后)都是int类型,这就可以工作,但如果它们是intvoid *的混合体呢?我应该如何更改模板以允许这样做?

这是针对语言之间的外部函数接口,因此另一端检查键,并在此基础上知道内存中跟随它的结构类型。

不能将任何类型的值作为模板参数发送。不能发送结构值、浮点值或字符串文字。我提出了一个解决方案,我认为它将取代任何这方面的需要。

选项1

只需使用返回对象的静态函数定义一个结构即可。

struct Initializer {
constexpr static SomeType initialize(char id) {
return SomeType{id, 1.2, "blerg"};
}
};

然后,将初始值设定项作为模板参数发送:

template <char id, typename Init> struct MyStruct {
using DataType = decltype(Init::initialize(id));
static constexpr DataType member = Init::initialize(id);     
static constexpr void *get() {
return(&member.key);
}
};

选项2

您可以将initialize函数放入预期为Datatype的结构中,因此可以执行以下操作:

DataType = DataType::initialize(id);

选项3

在结构初始值设定项中,您也可以创建一个元组,其中包含DataType结构所需的所有额外参数。这将是与您想要编写的代码最接近的解决方案。初始化结构将如下所示:

struct Initializer {
constexpr static std::tuple<float, const char*> args{1.5, "patate"};
using args_t = decltype(args);
};

然后您必须使用整数序列对其进行解压缩:

template<char, typename, typename, typename> struct Base;
template<char id, typename DataType, typename Init, std::size_t... S>
struct Base<char, DataType, Init, std::index_sequence<S...>> {
constexpr static DataType member{id, std::get<S>(Init::args)...};
};

您现在可以用MyStruct扩展Base

template <char id, typename DataType, typename Init> 
struct MyStruct : Base<id, DataType, Init,
std::make_index_sequence<std::tuple_size<typename Init::args_t>::value>
> {
static constexpr void *get() {
return(&member.key);
}
};

这些是一堆有用的解决方案。我相信还有其他人。