std::bind 和 std::function 项不评估为采用 0 个参数?
std::bind and std::function term does not evalue as taking 0 arguments?
我正在研究通用 class,它将用于 运行 不同原型的函数以进行算法性能测试。
我卡住了,因为 std::function
无法执行它所绑定的内容,这里是示例代码,在发生错误的地方附上注释:
#include <utility>
#include <functional>
template<typename ReturnType>
class Performance
{
public:
template<typename... Args>
using Algorithm = std::function<ReturnType(Args...)>;
template<typename... Params>
void run(const Algorithm<Params...>& ref, const Algorithm<Params...>& target)
{
// ERROR: term does not evaluate as taking 0 args
ref();
target();
}
};
void bar1(int, int)
{
// algorithm 1
}
void bar2(int, int)
{
// algorithm 2
}
int main()
{
using test = Performance<void>;
using Algorithm = test::Algorithm<int, int>;
int x = 0;
int y = 1;
Algorithm ref = std::bind(bar1, std::ref(x), std::ref(y));
Algorithm target = std::bind(bar2, std::ref(x), std::ref(y));
test foobar;
foobar.run(ref, target);
}
问题是,std::function
类型,即 Algorithm
被声明为采用两个参数(类型为 int
);调用它们时需要两个参数。
应用std::bind
后,返回的仿函数不带参数;参数(std::ref(x)
和 std::ref(y)
)已绑定。 Algorithm
应声明为
using Algorithm = test::Algorithm<>;
我正在研究通用 class,它将用于 运行 不同原型的函数以进行算法性能测试。
我卡住了,因为 std::function
无法执行它所绑定的内容,这里是示例代码,在发生错误的地方附上注释:
#include <utility>
#include <functional>
template<typename ReturnType>
class Performance
{
public:
template<typename... Args>
using Algorithm = std::function<ReturnType(Args...)>;
template<typename... Params>
void run(const Algorithm<Params...>& ref, const Algorithm<Params...>& target)
{
// ERROR: term does not evaluate as taking 0 args
ref();
target();
}
};
void bar1(int, int)
{
// algorithm 1
}
void bar2(int, int)
{
// algorithm 2
}
int main()
{
using test = Performance<void>;
using Algorithm = test::Algorithm<int, int>;
int x = 0;
int y = 1;
Algorithm ref = std::bind(bar1, std::ref(x), std::ref(y));
Algorithm target = std::bind(bar2, std::ref(x), std::ref(y));
test foobar;
foobar.run(ref, target);
}
问题是,std::function
类型,即 Algorithm
被声明为采用两个参数(类型为 int
);调用它们时需要两个参数。
应用std::bind
后,返回的仿函数不带参数;参数(std::ref(x)
和 std::ref(y)
)已绑定。 Algorithm
应声明为
using Algorithm = test::Algorithm<>;