使用“typename Container :: value_type”作为返回值时无法推断模板参数

问题描述 投票:2回答:1

首先定义一个泛型函数,其目的是为输入列表执行函数,并打印出每个输入和相应的函数执行结果。

在下面,func是对函数的引用,funcName只是终端显示的函数名,inputsfunc的参数。

#define TBOLD(x) "\x1B[1m" x __RST
#define TRED(x) __KRED x __RST

template<typename ...TInputs, typename TOutput>
void test_func(TOutput func(TInputs &...), 
        const string &funcName, 
        vector<tuple<TInputs...>> inputs,
        const string &resultDelimiter = ", ")
{
    cout << funcName << endl;
    if (is_same<TOutput, bool>::value)
        cout << boolalpha;

    for (auto &input: inputs)
    {
        auto arg_idx = 0;
        apply([&arg_idx](auto &&... args)
              { ((std::cout << args << (++arg_idx == sizeof...(TInputs) ? TBOLD(TRED(" : ")) : ", ")), ...); }, input);
        cout << apply(func, input) << endl;
    }
}

现在假设我有以下功能,

static int func1(vector<int> &arr, int &k)
{
    sort(arr.begin(),arr.end());
    return arr[k];
}

template<typename Container>
static typename Container::value_type func2(Container &arr, int &k)
{
    sort(arr.begin(),arr.end());
    return arr[k];
}

现在以下行将编译,

test_func(func1,"func1",vector<tuple<vector<int>,int>>{make_tuple(vector<int>{3,5,1,2,4},2)})

但以下内容不会编译并给出“无法推断模板参数TOutput”的消息。在我看来,这应该提供足够的信息来推断输出类型TOutputinputs参数是vector<tuple<vector<int>,int>>类型,然后它应该知道TInputs...<Container, int>,然后TOutputContainer::value_type

test_func(func2,"func2",vector<tuple<vector<int>,int>>{make_tuple(vector<int>{3,5,1,2,4},2)})

如果这确实不起作用,那么正确识别返回类型的正确方法是什么,同时保留此test_func的“通用性”以接受不同参数和输出的函数?

c++ c++11 templates
1个回答
1
投票

模板参数推导的工作方式,模板参数与每个参数分开推导。之后,每个参数必须至少确定一次,如果确定不止一次,所有扣除必须生成相同的类型。

你似乎期望从TInputs论证推断出inputs,然后插入func论证,希望TOutput将出来。模板参数推导不起作用。

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