- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个函数,该函数接受任何类型的可变数量的参数,但即使是我制作的简单示例也会出现错误
#include <iostream>
#include <functional>
template<class... Ts>
void callFunction(const std::function<void(Ts...)>& function, Ts... parameters)
{
function(parameters...);
}
void myFunc(const std::string& output)
{
std::cout << output << std::endl;
}
int main()
{
callFunction<const std::string&>(&myFunc, "Hello world");
return 0;
}
当我在 Ideone 中运行上面的代码时,我得到这个错误:
prog.cpp: In function ‘int main()’:
prog.cpp:17:57: error: no matching function for call to ‘callFunction(void (*)(const string&), const char [12])’
callFunction<const std::string&>(&myFunc, "Hello world");
^
prog.cpp:5:6: note: candidate: template<class ... Ts> void callFunction(const std::function<void(Ts ...)>&, Ts ...)
void callFunction(const std::function<void(Ts...)>& function, Ts... parameters)
^~~~~~~~~~~~
prog.cpp:5:6: note: template argument deduction/substitution failed:
prog.cpp:17:57: note: mismatched types ‘const std::function<void(Ts ...)>’ and ‘void (*)(const string&) {aka void (*)(const std::__cxx11::basic_string<char>&)}’
callFunction<const std::string&>(&myFunc, "Hello world");
最佳答案
一个简单的建议:将可调用对象作为推导的类型名接收,而不是作为 std::function
我的意思是(还添加完美转发)
template <typename F, typename ... Ts>
void callFunction(F const & func, Ts && ... pars)
{ func(std::forward<Ts>(pars)...); }
而且,显然,不加解释地调用它
callFunction(&myFunc, "Hello world");
这是避免将可调用对象转换为 std::function
的额外优势。
无论如何,我在您的代码中发现了两个问题:
1) 如果您接收函数作为 std::function
接收参数类型列表(在本例中为可变参数列表,但对于此问题并不重要)作为列表相同类型的参数,您必须确定两个列表中的类型完全匹配。
这不是你的情况,因为该函数接收一个 std::string const &
并且你将字符串文字 "Hello world"
作为参数传递char const [12]
是不同的类型。
当要推导类型时,这会导致编译错误,因为编译器无法在两种类型之间进行选择。
您可以解决接收两个类型列表
template <typename ... Ts1, typename Ts2>
void callFunction (std::function<void(Ts1...)> const & function,
Ts2 && ... parameters)
{ function(std::forward<Ts2>(parameters)...); }
但是现在我们遇到了第二个问题
2) 您传递一个指针函数 (&myFunc
),其中 callFunction()
等待 std::function
。
我们遇到了先有鸡还是先有蛋的问题,因为 &myFunc
可以转换为 std::function
但不是 std::function
.
因此编译器无法从 &myFunc
中推断出 Ts...
类型列表,因为它不是 std::function
并且无法将 &myFunc
转换为 std::function
因为不知道 Ts...
类型列表。
我看到您已经在 Ts...
列表中解释了 first 类型,但这还不够,因为 Ts...
列表是可变的,因此编译器不知道 Ts...
列表中只有一种类型。
此问题的一个简单解决方案是将函数作为简单推导的 F
类型传递。
否则,如果您使用两个模板类型列表编写了 callFunction()
,则可以将 std::function
传递给函数
std::function<void(std::string const &)> f{&myFunc};
callFunction(f, "Hello world");
但我认为这不是一个令人满意的解决方案。
关于c++ - "template argument deduction/substitution failed"带有参数包的函数对象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55992377/
2019-07-04:更新 结束使用 options: env: 不完美,因为在构建步骤中不允许变量,但至少涵盖了环境。 问题 GCP Cloud build不替换 substitutions
我正在使用 NSubstitute。我必须伪造一个类,无法挖掘出 Substitute.For() 的区别和 Substitute.ForPartsOf .我已经阅读了文档,但不明白两者的行为不同。
我正在尝试在 Agda 中使用等递归类型对按推值调用 lambda 演算进行编码。所以我用最多n个自由值类型变量相互定义值类型和计算类型(我只需要用值类型代替等递归类型)如下(这只是一个片段)。 da
有没有办法用s///同时进行替换?例如,如果我有一个带有1、2、3等数字的字符串,并且我想用“tom”代替1,用“mary”代替2,用“jane”代替3,等等? my $a = "1323131323
我有一个使用模板的 Jav::String 类。 class String { String(); String(std::size_t); template String(co
考虑以下 C99 结构,以灵活的数组成员结尾: struct hdr { size_t len; size_t free; char buf[]; }; 例如, len 可以通过这样
我有一个范围,包含数值和空白单元格。一些数值将以 * 作为后缀。 10* 5 7 9 25* 10 当我执行 SUM(A1:A8) 时,我得到 5+7+9+10 = 31 的结果,即所需的输出。
有没有办法一次交换多个字符串实例而不嵌套? 例如,假设我想从字符串中删除以下值的所有实例: 目标 沃尔玛 简历 输入字符串: “我去了 Target 而不是沃尔玛,但我真的很想去 CVS” 输出字符串
我在 Vim 的 substitute 中遇到了一个行为。 - 我不能的命令 真正遵循: 给定以下包含 && 的代码行我想要的序列 替换 &&与 &&和换行符: return a && b 在我的第一
为了说明我的问题,请使用以下简单示例。 我希望能够将“替换”和“那个”之间的任何文本替换为“完成”。例如,以下两个字符串: blah blah blah replace this and that b
我之前问过一个关于How to take in text/character argument without quotes的问题.在我在那个问题中提供的场景中,参数的数量是固定的,所以我在函数定义中
我正在尝试将一些 Selenium HTML 测试转换为使用 WebDriver 2.0 框架。根据网站 (http://seleniumhq.org/docs/03_webdriver.html),
那应该很容易...如何在下图中的标题中以粗体显示 i (=1)(仅调整参数 main)? i <- 1 plot(0~0, main=substitute(bold("foo"~i.~"bar"),
那应该很容易...如何在下图中的标题中以粗体显示 i (=1)(仅调整参数 main)? i <- 1 plot(0~0, main=substitute(bold("foo"~i.~"bar"),
这是一个现有的通用 css 规则(原始文件): .caption-top { color: red; } 这是示意图,因为在现实生活中,我需要根据上下文将 .caption-top 选择器变成其他
这是我的代码: $(".tooltip").live('click', function() { var texte = $('#tiptip_content').text(); $(
我需要帮助将变量子化为正则表达式 这条线工作正常: subject = subject.replace(//g, emoticons[1]); 我需要为变量切换单词“Smile”。 我尝试了一些不同的
我读了一篇摘要,其中在谈到继承时总是使用“替代原则”的定义。但并没有解释这个原理的含义。 这个原理是什么? 谢谢。 最佳答案 意思很简单:子类必须遵守父类(super class)设定的契约。 如果你
我有一个变量,它是一个 url,我想在 bash 中替换该 url 的一部分,但我一直收到“错误的替换” URL="http://hostname/project/branches/Old_Branc
#!/bin/bash jobname="job_201312161447_0003" jobname_pre=${jobname:0:16} jobname_post=${jobname:17} 这
我是一名优秀的程序员,十分优秀!