C++中的可变参数函子可以支持命名字段吗?
Can variadic functors in C++ support named fields?
我正在实现一个名为"Signal<args>
"的可变参数函子泛型,它管理匹配函数签名类型的函子的内部队列。在调用Signal<args>::operator()
队列中的每个函子都使用相同的输入参数执行。这个想法是,它是一个纯C++11对象类型,它重新创建了一些与Qt的Signal/Slot结构相同的设计行为,但静态编译的依赖项最少。我一切正常,但我想提高这个通用的可读性。
语法我有:
Signal<int, double> signal;
signal.add(BLOCK, [](int EmployeeID, double FavoriteNumber) {
std::cout << EmployeeNames[EmployeeID]
<< " has favorite number of "
<< FavoriteNumber << std::endl;
});
signal.add(BLOCK, [](int EmployeeID, double FavoriteNumber) {
if (EmployeeID > FavoriteNumber) {
std::cout << EmployeeNames[EmployeeID]
<< " has ID bigger than favorite number.n";
}
});
signal(5, 3.1415); //execute both functors with args = (5, 3.1415)
我想要什么:
Signal<int EmployeeID, double FavoriteNumber> signal;
signal.add(BLOCK, [](int EmployeeID, double FavoriteNumber) {
std::cout << EmployeeNames[EmployeeID]
<< " has favorite number of "
<< FavoriteNumber << std::endl;
});
signal.add(BLOCK, [](int EmployeeID, double FavoriteNumber) {
if (EmployeeID > FavoriteNumber) {
std::cout << EmployeeNames[EmployeeID]
<< " has ID bigger than favorite number.n";
}
});
signal(5, 3.1415); //execute both functors with args = (5, 3.1415)
唯一的区别是,为了便于阅读,我希望模板化信号类型的声明为参数指定名称。理想情况下,我希望这些名称是强制性的,如果未指定,则编译失败。
有没有办法实现这一目标?
您可以利用函数类型允许为其参数命名的事实,让您编写:
Signal<void(int EmployeeID, double FavoriteNumber)> mySignal;
该名称不是必需的,但允许使用。
为此,请对Signal
进行部分专用化:
template <typename>
class Signal;
template <typename... Args>
class Signal<void(Args...)> {
// Old implementation of Signal<...>
};
简单的解决方案是使用标签类型,例如
struct EmployeeID_T {};
struct FavoriteNumber_T {};
并将参数类型绑定到名称,例如
using EmployeeID = SignalArg<EmployeeID_T, int>;
using FavoriteNumber = SignalArg<FavoriteNumber_T, double>
所以你得到
Signal<EmployeeID, FavoriteNumber> mySignal;
signal.add(BLOCK, [](EmployeeID eid, FavoriteNumber fn) {
std::cout << EmployeeNames[eid]
<< " has favorite number of "
<< fn << std::endl;
});
signal.add(BLOCK, [](EmployeeID eid, FavoriteNumber fn) {
if (eid > fn) {
std::cout << EmployeeNames[eid]
<< " has ID bigger than favorite number.n";
}
});
mySignal(5, 3.1415); //execute both functors with args = (5, 3.1415)
您需要一个具有适当构造函数和转换运算符的SignalArg
模板,但由于我还没有写出来,因此可能需要一些强制。
标记类型可防止具有相同基础类型的不同参数之间的隐式转换,仅使用 typedef 即可实现隐式转换。
您还可以通过显式使用 SignalArg 转换构造函数来获取类似命名参数的内容,因此调用将如下所示
mySignal(EmployeeID{5}, FavoriteNumber{3.1415});
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- C++中的可变参数函子可以支持命名字段吗?
- 自动复制=按值并支持多态性的适当类型的非静态字段
- OpenCV错误:cvGetMat中有错误的标志(参数或结构字段)(无法识别或不支持的数组类型)