如何在将函数作为参数传递给文件中.cpp函数模板时声明

How to declare when passing function as parameter to function template in .cpp file?

本文关键字:文件 cpp 函数模板 声明 参数传递 函数      更新时间:2023-10-16

我试图通过阅读一本书并从该书中锻炼C++自己。

现在我正在尝试在.cpp文件中声明函数模板的实例。我知道我可以在头文件中声明/定义该函数模板,但我仍然对如何在.cpp文件中执行此操作感到好奇。

这是一段微不足道的代码,但演示了我的问题:

// temp_func.h
#ifndef GUARD_temp_func
#define GUARD_temp_func
#include <iostream>
using std::cout;    using std::endl;
int addone(int);
int addtwo(int);
template<typename F>
void call_adds(int, F);
#endif

头文件

// temp_func.cpp
#include "temp_func.h"
using std::cout;    using  std::endl;
int addone(int n)
{
    return n + 1;
}
int addtwo(int n)
{
    return n + 2;
}
template<typename F>
void call_adds(int n, F f)
{
    cout << f(n) << endl;
}
template void call_adds<addone>(int n, F addone);

.cpp文件,显然最后一行不起作用。

编辑:基于N.m.提供的解决方案。

template<int F(int)>
void call_adds(int n)
{
    cout << F(n) << endl;
}
template void call_adds<addtwo>(int);
template void call_adds<addone>(int);

您的call_ads模板需要类型参数。 addone不是一种类型,而是一个函数。您可以专门针对 int(int) 等类型进行call_adds,但不能专门用于该类型的单个函数。

您可以使用非类型模板参数创建函数模板:

template <int F(int)>
void call_adds(int n)
{
    cout << F(n) << endl;
}

并专门化它:

template<> void call_adds<addtwo> (int n) { ... }

请注意,call_adds不再有常规函数参数,只有模板参数。

编译器并不真正关心你是在头文件还是在源文件中声明某些内容,只要声明在应该在哪里可见即可。