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

时间:2016-05-22 03:28:34

标签: c++ templates c++11

我的类有一个静态的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 个答案:

答案 0 :(得分:1)

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

选项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

在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);
    }
};

这些是一堆有用的解决方案。我确定那里有其他人。