gpt4 book ai didi

c++ - 如何从 TypeList 重建参数包

转载 作者:可可西里 更新时间:2023-11-01 18:29:07 46 4
gpt4 key购买 nike

我有一个可变模板类型列表:

template <class... Types>
struct typelist {};

然后我如何将它传递给一些需要参数包的外部代码,比如 std::tuple .换句话说,我需要将参数包作为成员或 typedef 存储在我的类型列表中,例如

...
struct typelist {
using types = Types; // Imaginary syntax
}

然而,这被编译器拒绝,说类型未扩展。

任何解决方法?

此问题在 comments of this question 中以另一种方式提及,但未包含在现有答案中。


评论中要求的详细信息:

如果我编译 (-std=c++17):

template <class... T>
struct typelist {};

std::tuple<typelist<int, int>> tp{0,1};

g++ 给出 error: no matching function for call to ‘std::tuple<typelist<int, int> >::tuple(<brace-enclosed initializer list>)’
std::tuple<typelist<int, int>> tp{0,1};

如果我编译 (-std=c++17):

template <class... T>
struct typelist {
using types = T;
};

g++给出 error: parameter packs not expanded with ‘...’:
using types = T;

最佳答案

您需要一些样板文件才能从 typelist 中获得正确的 tuple 特化,因为您不能简单地按原样存储参数包。
例如,您可以通过正确使用函数声明和 using 声明来做到这一点:

#include<tuple>
#include<utility>
#include<type_traits>

template <class... T>
struct typelist {};

template<typename... T>
std::tuple<T...> foo(typelist<T...>);

template<typename L>
using tupleFromTypelist = decltype(foo(std::declval<L>()));

int main() {
using tl = typelist<int, int>;
tupleFromTypelist<tl> tp{0,1};
static_assert(std::is_same<tupleFromTypelist<tl>, std::tuple<int, int>>::value, "!");
}

或者像下面例子中的辅助类:

#include<tuple>
#include<utility>
#include<type_traits>

template <class... T>
struct typelist {};

template<typename>
struct helper;

template<typename... T>
struct helper<typelist<T...>> {
using type = std::tuple<T...>;
};

int main() {
using tl = typelist<int, int>;
helper<tl>::type tp{0,1};
static_assert(std::is_same<helper<tl>::type, std::tuple<int, int>>::value, "!");
}

否则,让 typelist 公开 tuple 特化并直接从中获取:

#include<tuple>
#include<utility>
#include<type_traits>

template <class... T>
struct typelist {
using tuple = std::tuple<T...>;
};

int main() {
using tl = typelist<int, int>;
tl::tuple tp{0,1};
static_assert(std::is_same<tl::tuple, std::tuple<int, int>>::value, "!");
}

如果它是您想要为其使用参数包的唯一类型,这是最简单的方法。

关于c++ - 如何从 TypeList 重建参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43155987/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com