我有一个包含2个不同函数声明的.h
文件:
#ifdef MY_HEADER
#define MY_HEADER
void a();
void b();
#endif
现在进入.cpp
文件我希望将这些函数实现为另一个模板化函数的不同实例:
#include "my_header.h"
namespace {
template<size_t N>
void c()
{
...
}
}
void (*a)() = c<42>;
void (*b)() = c<265>;
我收到错误消息error: 'void (* a)()' redeclared as different kind of symbol
。我还试过a = c<42>
和auto a = c<42>
但没有运气。
我知道我可以这样做:
void a() {c<42>();}
void b() {c<265>();}
我几乎可以肯定编译器会为我优化这个额外的函数调用,但是我想知道是否有更好的方法来声明这个。我不想将c
函数本身放入.h
文件中,因为此函数非常繁重,我不希望使用我的标头在每个源文件中重新编译它。
答案 0 :(得分:4)
您只需要将a
和b
的声明与定义匹配,因此将它们声明为void(*)()
个变量,而不是void()
个函数。
其他答案表明std::function<void()>
忽略了它是一个非常重量级的选择。
my_header.h
#ifdef MY_HEADER
#define MY_HEADER
extern void (*a)();
extern void (*b)();
#endif
my_impl.cpp
#include "my_header.h"
namespace {
template<size_t N>
void c()
{
...
}
}
void (*a)() = c<42>;
void (*b)() = c<265>;
您可能希望禁止修改a
和b
,并将它们声明为void (* const)()
,即(const指针)指向(函数)。
extern void (* const a)();
...
void (* const a)() = c<42>;
...
// a = c<53>; // error: assignment of read-only variable 'a'
答案 1 :(得分:1)
您可以执行以下操作:
标题文件:
#ifndef MY_HEADER
#define MY_HEADER
#include <functional>
extern std::function<void()> a;
extern std::function<void()> b;
#endif
实施档案:
#include "Header.h"
namespace {
template<size_t N>
void c() {
...
}
}
std::function<void()> a = std::bind(&c<42>);
std::function<void()> b = std::bind(&c<265>);
答案 2 :(得分:1)
我想知道是否有更好的方法来宣布这一点。
如果您正在为功能类型寻找更通用的更高包装器,请使用std::function
。
在.h
文件中,声明:
#include <functional>
std::function<void()> a;
在.cpp
文件中,为其指定所需的功能:
a = c<42>;
a();
确保使用std::function
的开销,但这对于这样一项微不足道的工作来说可能相当昂贵。
答案 3 :(得分:0)
这对我有用,可能是一个解决方案:
header.h
template<size_t N>
void c() {
...
}
的main.cpp
#include "header.h"
void (*a)(void) = c<10>;
int main() {
a();
}