具有两个(或多个)特定包(专业化/重载)的可变函数模板

问题描述 投票:3回答:3

函数'Process'正在使用可变类型的变量数目] >>。为了处理不同的情况,我已经像这样成功地重载了它:

// general case
template <typename ...Types>
void Process( const Types&... items )

// single T
template <typename T>
void Process( const T& t )

// one or more of type NVP<>
template <typename T1, typename ...Types>
void Process( const NVP<T1>& nvp1, const NVP<Types>&... nvps )

[我想做的-但不能-是以下] >>:对于具有任意数量的类型为ATT<>的前导参数然后跟任意数量的NVP<>的情况,我需要重载:

// any number of leading Types ATT<> followed by any number of NVP<>
template <typename ...ATypes, typename ...BTypes>
void Process( const ATT<ATypes>&... atts, const NVP<BTypes>&... nvps )

首先,如果编译器已经可以完成其他情况,那么匹配它会很容易。这里绝对应该没有歧义!但是,匹配失败,没有错误消息,但是所需的重载只是被编译器忽略。

当前与/ std:c ++ 17一起使用VS2017


注意:

[1。

显然,可以对one这样的前导类型ATT<T1>执行此操作
// one leading Type ATT<T1>
template <typename T1, typename ...Types>
void Process( const ATT<T1>& a1, const Types&... remaining )

但是对于不止一个,我需要进行一些难看的手动递归。 我真的很想拥有一整个领先的ATT<...>

2。我知道,一般类型的前导参数包对于匹配始终是模棱两可的,但对于像ATT<ATypes>...这样的特殊化,应该不存在歧义。

函数'Process'正在使用可变数量的可变类型参数。为了处理不同的情况,我已经像这样成功地重载了它://一般情况模板

c++ c++17 variadic-templates variadic-functions overload-resolution
3个回答
0
投票

相信您可以在此处使用结构来帮助您。编译器无法确定一个参数包在哪里停止而另一个参数包在哪里开始,请考虑:

foo(1, 2.0, '3', "45", 6.0f)。第一个参数包可以是空,第一个参数包可以是所有,或者都不是。没有特别的理由要优先于另一个。因此,您不能使函数接受两个变量。您可以做的是将其拆分为两个结构,并为外部类指定explicitly

参数。

0
投票

假设您可以将它们作为元组接受,那么我从https://stackoverflow.com/a/12782697/1480324绘制后就做了这个:

#include <iostream>
#include <tuple>

template<typename T>
struct ATT {};

template<typename T>
struct NVP {};

template<typename... ATTs, typename... NVPs>
void Process(const std::tuple<ATT<ATTs>...>& atts, const std::tuple<NVP<NVPs>...>& nvps) {
    std::cout << sizeof...(ATTs) << std::endl;
    std::cout << sizeof...(NVPs) << std::endl;
}

int main() {
    Process(std::make_tuple(ATT<int>(), ATT<double>()), std::make_tuple(NVP<std::string>(), NVP<bool>()));

    return 0;
}

0
投票

您可以根据const Types&...是否匹配Types...,从ATT<T>..., NVP<U>...重载中调度。

[这里的基本策略是找到最后一个ATT<T>的索引,将所有内容作为一个元组转发,然后使用适当的索引序列进行索引以转发到另一个函数,其中ATT值和NVP值位于两个元组中:

© www.soinside.com 2019 - 2024. All rights reserved.