将模板化实现分配给先前声明的函数

时间:2018-03-23 08:58:33

标签: c++ c++11

我有一个包含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文件中,因为此函数非常繁重,我不希望使用我的标头在每个源文件中重新编译它。

4 个答案:

答案 0 :(得分:4)

您只需要将ab的声明与定义匹配,因此将它们声明为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>;

See it live

您可能希望禁止修改ab,并将它们声明为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();
}