【发布时间】: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