我的类有一个静态的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
类型,但只要它们是int
和void *
的混合,它就会起作用吗?我该如何更改模板才能允许?
这是针对语言之间的外部函数接口,因此另一端检查密钥,并根据它知道内存中跟随它的结构类型。
答案 0 :(得分: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);
}
};
您可以将initialize函数放在预期为Datatype
的结构中,这样就可以执行此操作:
DataType = DataType::initialize(id);
在struct initializer中,您也可以使用DataType
struct需要的所有额外参数创建一个元组。这将是您想要编写的代码中最接近的解决方案。初始化结构将如下所示:
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)...};
};
您现在可以Base
延长MyStruct
:
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);
}
};
这些是一堆有用的解决方案。我确定那里有其他人。