【问题标题】:Passing functions with multiple parameters as a template parameter将具有多个参数的函数作为模板参数传递
【发布时间】:2018-06-30 19:01:04
【问题描述】:

原问题

如何将不带参数的函数作为模板传递?

原因是我已经更新了我的 Queue 数据结构,正如我在另一个关于如何determine whether a function parameter is a function 的问题中被告知的那样。

现在,唯一的问题是它只接受没有参数的函数。有没有办法改进它以接受多个参数?

这是我的代码:

// Necessary includes:
#include <vector>
#include <any>

// If the data is a function:
void call_if_function(void (*function)()) {
    function();
}

// If the data is not a function:
void call_if_function(std::any variable) {
    (void)variable;
}

template <class T>
class Queue {
    // Public members:
    public:
        // Enqueue data:
        void Enqueue(const T& data) {
            vec_.push_back(data);
        }

        // Dequeue data:
        void Dequeue() {
            T holder = vec_.front();

            vec_.erase(vec_.begin());

            call_if_function(holder);
        }

    // Private members:
    private:
        std::vector<T> vec_;
}

编辑的问题

在持续测试期间,我最终尝试使用模板。但我不确定如何检查模板变量是否存在。

【问题讨论】:

  • 只需相应地更改函数签名CallIfItIsAFunction(void (*function)(int x), int x) { (*function)(x); }或使其成为类似于std::invoke的模板
  • @VTT 但int 不允许整数类型?
  • 放任何你想要的类型而不是int
  • @VTT Queue 将成为一个名为 smart-cpp 的小型库的一部分,因此它需要类型推断。这就是它被模板化的原因。
  • 这是您被要求做事的链条中的第二个问题,而您的示例原因似乎是……值得怀疑。请描述您正在寻找的实际最终用途,以及遇到的小技术问题。有你正在解决错误问题的每首歌。也称为 X/Y 问题。

标签: c++ function templates parameters


【解决方案1】:

@VTT 的 cmets 真的救了我。

#include <variant>

typedef std::variant<int, double> any_num;

any_num add(any_num a, any_num b)
{
    return a + b;
}

any_num call_if_function(any_num(*function)(any_num, any_num), any_num a, any_num b)
{
    return function(a, b);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多