c++ - C++ 中的可变仿函数可以支持命名字段吗?

标签 c++ c++11 variadic-templates variadic-functions

我正在实现一个名为“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/

相关文章:

c++ - 有没有标准的 Linux C++ 输入库可供使用?

c++ - 如何将聚合初始化列表推送到 vector 中?

c++ - 如何为包含头文件的目标编写 makefile?

c++ - 为什么在预期 T 或 T& 时定义重载运算符的任意返回类型是合法的

c++ - pretty-print std::tuple

c++ - Variadic 模板模板和 SFINAE

c++ - 运行时错误 :stack around `szDeviceType ` is corrupted

c++ - VisualStudio 2010 - 不再有自动预编译头?

c++ - 可变参数模板在以下情况下如何工作?

c++ - 在运算符重载中使用可变参数模板是否合法?