gpt4 book ai didi

c++ - 修改元组元素的类型

转载 作者:行者123 更新时间:2023-11-30 01:39:15 25 4
gpt4 key购买 nike

将类型列表作为可变参数模板参数,可以很容易地对它们执行任意类型操作,从而获得修改类型的元组。例如。要用自定义包装器类包装每个元素,可以这样做:

template<typename T> class Wrapper {};

template<typename ...Values>
using WrappedValues = std::tuple<Wrapper<Values>...>;

using NewTuple = WrappedValues<int, std::string, char>;
static_assert(std::is_same<NewTuple, std::tuple<Wrapper<int>, Wrapper<std::string>, Wrapper<char>>>::value, "");

当将 std::tuple 特化为“输入”时,如何做同样的事情?例如。应该放置什么而不是“???”使以下代码可编译:

template<typename T> class Wrapper {};

template<typename Tuple>
using WrappedTupleElements = ???;

using NewTuple = WrappedTupleElements<std::tuple<int, std::string, char>>;
static_assert(std::is_same<NewTuple, std::tuple<Wrapper<int>, Wrapper<std::string>, Wrapper<char>>>::value, "");

我知道使用 std::tuple_element 和递归模板实例化访问元组元素类型的可能性,但我不知道如何将以这种方式创建的类型收集到一个元组中。

首选是纯 C++14 答案,但也欢迎使用 C++17、广泛可用的 TSes 或外部库(例如 boost)的建议。

最佳答案

为什么不使用允许特化的附加结构模板:

#include <string>
#include <tuple>
#include <type_traits>

template<typename T> class Wrapper {};

template<typename Tuple>
struct WrappedTupleElements;

template <class... Values>
struct WrappedTupleElements<std::tuple<Values...>> {
using type = std::tuple<Wrapper<Values>...>;
};

int main() {
using NewTuple = WrappedTupleElements<std::tuple<int, std::string, char>>::type;
static_assert(std::is_same<NewTuple, std::tuple<Wrapper<int>, Wrapper<std::string>, Wrapper<char>>>::value, "");
}

[live demo]

关于c++ - 修改元组元素的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46131102/

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