使用更多标准类型显式实例化给定模板函数的函数?
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)
我有以下问题。假设我有一个带有此模板函数声明的头文件 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)