广义 std::function (std::any 表示可调用对象)
Generalised std::function (std::any for callable objects)
如何创建一个可以接受任何可调用对象的广义std::function
类型的变量?我不能使用可变参数模板,因为它会创建一个不同类型的系列,而我需要单个类型,以便我可以将不同的[&]
lambda 带到同一个数组中。
我用产生std::function<void()>
的函子(下面的示例(做到了这一点,但为此我必须为我的函数使用的每组参数创建一个函子。现在我想使用 lambda 来绑定参数,但它们的类型很棘手,我无法将不同的 lambda 绑定到同一个数组。
我知道这将是非常不安全的。
#include <iostream>
#include <vector>
#include <string>
using ChoiceArray = std::vector<std::function<void()>>;
int GetInt(int restriction);
class MenuFunctor {
private:
std::string output;
ChoiceArray arrayOfFunctions;
public:
MenuFunctor(std::string n_output, ChoiceArray n_arrayOfFunctions)
: output(n_output), arrayOfFunctions(n_arrayOfFunctions)
{ }
void operator()() const {
int selection;
std::cout << output;
selection = GetInt(int(arrayOfFunctions.size()));
arrayOfFunctions[selection]();
}
};
class OperationFunctor {
private:
std::function<void(std::vector<std::string>*)> func;
std::vector<std::string>* container;
public:
OperationFunctor(std::function<void(std::vector<std::string>*)> n_func, std::vector<std::string>* n_container)
: func(n_func), container(n_container)
{ }
void operator()() const {
func(container);
}
};
void Func1(std::vector<std::string>* container);
void Func2(std::vector<std::string>* container);
void Func3(std::vector<std::string>* container);
int main() {
std::vector<std::string> container;
std::vector<std::string>* containerAddress = &container;
OperationFunctor f1(Func1, containerAddress);
OperationFunctor f2(Func2, containerAddress);
OperationFunctor f3(Func3, containerAddress);
ChoiceArray Array = {f1, f2, f3};
MenuFunctor Start("input 0-2n", Array);
Start(); // Works
return 0;
}
另外,我试图将std::vector<std::string> container
用于Func1
- 通过引用Func3
,但它不起作用,所以我使用了指针。它与完美转发有关吗?
只需将 lambda 塞入std::function<void()>
.
using OperationFunctor = std::function<void()>;
using ChoiceArray = std::vector<OperationFunctor>;
int GetInt(int restriction);
class MenuFunctor {
private:
std::string output;
ChoiceArray arrayOfFunctions;
public:
MenuFunctor(std::string n_output, ChoiceArray n_arrayOfFunctions)
: output(n_output), arrayOfFunctions(n_arrayOfFunctions)
{ }
void operator()() const {
int selection;
std::cout << output;
selection = GetInt(int(arrayOfFunctions.size()));
arrayOfFunctions[selection]();
}
};
void Func1(std::vector<std::string>* container);
void Func2(std::vector<std::string>* container);
void Func3(std::vector<std::string>* container);
int main() {
std::vector<std::string> container;
std::vector<std::string>* containerAddress = &container;
OperationFunctor f1([containerAddress]{ Func1(containerAddress) });
OperationFunctor f2([containerAddress]{ Func2(containerAddress) });
OperationFunctor f3([containerAddress]{ Func3(containerAddress) });
ChoiceArray Array = {f1, f2, f3};
MenuFunctor Start("input 0-2n", Array);
Start(); // Works
return 0;
}
相关文章:
- 为什么 std::unique 不调用 std::sort?
- std::cout.imbue()多重调用
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- 类型擦除的std::function与虚拟函数调用的开销
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- std::调用,未找到匹配的重载函数
- 线程 std::调用未知类型,无法专门化函数错误
- 如何使用 std:: 调用函数中的函数?
- 使用经典重载解析规则创建依赖于 std::调用的重载集类
- std::调用 end() 时出现多映射错误
- std::调用函数时找不到函数构造函数
- std::调用没有匹配的重载函数在VS 2015中发现错误