使用更多标准类型显式实例化给定模板函数的函数?

Function to explicitly istantiate a given template function with more standard types?

我有以下问题。假设我有一个带有此模板函数声明的头文件 header.hpp

template <typename T> extern T func();

并且在 header.cpp 文件中我有函数定义:

template <typename T> T func() { \* do something */ };

//Following lines are for explicit istantiation of the template for some types:
template double func <double> (); //1
template int func <int>(); //2
//And others...

是否存在函数/class 或其他允许我显式实例化更多模板类型的模板 class 定义的函数,而无需编写类似前一行的第 1 行或第 2 行的内容每次都写代码?

我正在搜索类似的内容,例如:

void function ( template_function list_of_types )
 {
  //explicit istantiations of the template_function for the types given in the list_of_types container...
 }

签名不一定要像上面那个,但也差不多,重要的是它像我之前说的那样工作。谢谢。

没有这样的功能。显式模板实例化必须出现在命名空间范围内,因此像这样的“函数”必须是某种编译器魔术(不存在),或者使用预处理器扩展到所需的声明中。

Boost.PP 这样的东西有机器来近似你所追求的。例如:

#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/tuple/to_seq.hpp>

#define ARGS(...) BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))

template <typename T> void func(T) { };
#define EXPANSION(r, data, elem) template void func<elem>(elem);

BOOST_PP_SEQ_FOR_EACH(EXPANSION, _, ARGS(int,double,char))

See the preprcoessor output live.

它可能会刺激那些对预处理器过敏的人,但它是为数不多的剩余预处理的合法用途之一。至少在 C++ 标准委员会选择为我们提供更好的工具之前。

您可以使用概念(或要求)并创建模板的专用版本。

所以如果你有

void func(auto t) { ...}

您可以定义一个概念“AllowedNumericalTypes”并编写另一个模板,例如

void func(AllowedNumericalTypes auto t) { /*1 and 2 */ }

编译器将选择与您的 func 方法最匹配的版本,然后调用它们。

btw. template<typename T> void func(T t)
 is identical to 
void func(auto t)