gpt4 book ai didi

c++ - 匹配偏特化以按类型替换元组元素

转载 作者:行者123 更新时间:2023-11-30 03:30:57 24 4
gpt4 key购买 nike

我已经搜索了很多并且可以找到很多类似的问题,但是他们都没有解决这个特定的问题 AFAIK。

我想按类型(而不是按索引)替换元组中的类型。我试过这样的事情:

template <class Tuple, class ToRemove, class ToReplace>
struct ReplaceType {
using type = Tuple;
};

template <class ToRemove, class ToReplace, class...Args, class...Args2>
struct ReplaceType<std::tuple<Args..., ToRemove, Args2...>, ToRemove, ToReplace> {
using type = std::tuple<Args..., ToReplace, Args2...>;

};

这行不通,但我不明白为什么不行。它说 Args... 和 Args2... 的参数不可推导,但对我来说,从调用站点猜测它应该很自然:

typename ReplaceType<std::tuple<int, float, char>, float, double>>::type;

从那里 int 应该是 Args1... 在模板特化和 char Args2...

  1. 为什么这行不通?
  2. 有什么解决方法吗?

最佳答案

一步一个脚印。

首先,使用专门化将一种类型映射到另一种类型,保持所有其他类型不变。如果 TToRemove,将其替换为 `ToReplace,否则保持不变:

template<typename T, typename ToRemove, typename ToReplace>
struct replace_type {

using type=T;
};

template<typename ToRemove, typename ToReplace>
struct replace_type<ToRemove, ToRemove, ToReplace> {

using type=ToReplace;
};

现在,一旦你解决了这个问题,使用专门化来解包元组类型,然后在使用 replace_type 清洗每个类型后重新打包它们:

template<class Tuple, typename ToRemove, typename ToReplace>
struct replace_tuple;

template<typename ...Args, typename ToRemove, typename ToReplace>
struct replace_tuple<std::tuple<Args...>, ToRemove, ToReplace> {

using type=std::tuple<typename
replace_type<Args, ToRemove, ToReplace>::type
...>;
};

使用 gcc 6.3.1 测试:

replace_tuple<std::tuple<int, char, int>, char, unsigned>::type foo;

std::tuple<int, unsigned, int> *bar=&foo;

关于c++ - 匹配偏特化以按类型替换元组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44621923/

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