使用 "typename Container::value_type" 作为返回值时无法推断模板参数
Could not infer template argument when using "typename Container::value_type" as the return value
首先定义一个泛型函数,其目的是为输入列表执行一个函数,并打印出每个输入和相应的函数执行结果。
在下文中,func
是对函数的引用,funcName
只是终端显示的函数名称,inputs
是func
的参数。
#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"的消息。在我看来,这应该提供了足够的信息来推断输出类型TOutput
:inputs
参数是vector<tuple<vector<int>,int>>
类型,那么它应该知道TInputs...
是<Container, int>
,然后TOutput
是Container::value_type
。
test_func(func2,"func2",vector<tuple<vector<int>,int>>{make_tuple(vector<int>{3,5,1,2,4},2)})
如果这确实不起作用,那么在保持此test_func
接受不同参数和输出的函数的"通用性"的同时,使返回类型正确识别的正确方法是什么?
模板参数推导的工作方式是,模板参数从每个参数中单独推导。之后,每个参数必须至少确定一次,如果确定多次,则所有推导必须产生相同的类型。
你似乎希望从inputs
论点中推断出TInputs
,然后插入func
论点,希望TOutput
会出来。模板参数推断无法以这种方式工作。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 无法使用 auto 来参数化true_type来检测 T::value()
- "Any value" 对于 'const std::string&' 参数
- cmake -D <var>:<type>=<value> 参数"-D"是什么意思
- 瓦尔格林德对带有默认参数的变量进行"conditional jump on uninitialized value"
- 具有非类型参数的类模板的静态成员的 gdb "static field value has been optimized out"
- SFINAE 尝试使用布尔值给出编译器错误:"模板参数'T::value'涉及模板参数"
- const或ref或const ref或value作为setter函数的参数