作为模板参数的值(任何类型)的列表
List of values (of any types) as a template argument
我的类有一个静态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 *
的混合体呢?我应该如何更改模板以允许这样做?
这是针对语言之间的外部函数接口,因此另一端检查键,并在此基础上知道内存中跟随它的结构类型。
不能将任何类型的值作为模板参数发送。不能发送结构值、浮点值或字符串文字。我提出了一个解决方案,我认为它将取代任何这方面的需要。
选项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);
}
};
这些是一堆有用的解决方案。我相信还有其他人。
相关文章:
- C++ 将 CIN 值存储到任何类型的数组中
- 对任何类型的元素数组进行排序
- 任何种类的分数 在任何类型的订单中
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 为自定义打印调试实现传递任何类型的变量
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- C++如何使虚拟函数返回任何类型的指针
- 任何类型的缓存机制
- 如何在C++中接收任何类型的函数参数并获取函数内传递变量的类型?
- 如何在C++变量中存储任何类型的函数
- 将任何类型的表达式放在 c++ 的初始化列表中在语法上是否正确?
- 第一次捕获捕获任何类型的
- C++包含任何类型的模板类对象的映射
- 接受对任何类型的可变引用的 Lambda
- 将任何类型转换为任何类型