You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将类模板可变参数包分组后用于成员模板?

问题:拆分可变模板参数包到不同成员模板

我想编写一个包含可变模板参数包的类模板,需要将参数包拆分为两组,分别用于两个成员模板的实例化。预期的类结构如下:

template <class... Args>
class Foo {
public:
    Foo(const Args&... args) :gr1{/*...*/}, gr2{/*...*/} {} 
private:
    template_one<Group1...> gr1;
    template_two<Group2...> gr2;
};

我已经实现了两个辅助工具:

1. 类型排序器(type_sorter)

用于在无实例参数时对类型进行分组,返回包含已排序类型的tuple对:

template <typename... Args>
struct type_sorter;

template <>
struct type_sorter<> {
    constexpr static auto sort() {return std::pair<std::tuple<>, std::tuple<>>{}; }
};

template <typename Arg, typename... Args>
struct type_sorter<Arg, Args...> {
    constexpr static auto sort() {
        auto ret = type_sorter<Args...>::sort();

        if constexpr (std::is_function_v<Arg>)
            return std::make_pair(std::tuple_cat(ret.first, std::tuple<Arg*>{}), ret.second);
        else
            return std::make_pair(ret.first, std::tuple_cat(ret.second, std::tuple<Arg>{}));
    }
};

2. 参数排序器(param_sorter)

用于同时处理类型和实例参数,返回包含已排序类型与对应参数的tuple对:

template <class Arg>
constexpr auto param_sort(Arg&& arg) {
    if constexpr (std::is_function_v<typename std::remove_reference_t<Arg>>)
        return std::make_pair(std::tuple<Arg>(arg), std::tuple<>());
    else
        return std::make_pair(std::tuple<>(), std::tuple<Arg>(arg));
}

template <class Arg, class... Args>
constexpr auto param_sort(Arg&& arg, Args&&... args) {
    auto ret = param_sort(std::forward<Args>(args)...);

    if constexpr (std::is_function_v<typename std::remove_reference_t<Arg>>)
        return std::make_pair(std::tuple_cat(ret.first, std::tuple<Arg>(arg)), ret.second);
    else
        return std::make_pair(ret.first, std::tuple_cat(ret.second, std::tuple<Arg>(arg)));
}

目前我以std::is_function作为分组判断依据,现在希望从type_sorter生成的tuple中提取出参数包Group1...和Group2...,用于声明template_one和template_two的成员变量,但尝试的代码无法通过编译。想询问这种操作是否可行?

内容的提问来源于stack exchange,提问作者drzecki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:13:29