作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个名为“Signal<args>
”的可变仿函数泛型,它管理匹配函数签名类型的仿函数的内部队列。随叫随到 Signal<args>::operator()
队列中的每个仿函数都使用相同的输入参数执行。这个想法是它是一个纯 C++11 对象类型,它重新创建了一些与 Qt 的信号/插槽构造相同的设计行为,但静态编译时依赖性最小。我的一切正常,但我想提高这个泛型的可读性。
我的语法:
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<...>
};
关于c++ - C++ 中的可变仿函数可以支持命名字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50630239/
我是一名优秀的程序员,十分优秀!