如何实现几个函数的编译时多态性
How to achieve compile time polymorphism of several functions?
我似乎应该使用函数作为模板参数,但不能这样做。
头文件如下所示:
foo_out_type foo(foo_in_type input);
baz_out_type bar(bar_in_type input);
template<typename T_IN, typename T_OUT>
void do_list(const vector<T_IN>& input,
vector<T_OUT>& output);
// I want to specialize the template code at compile time
// So the users don't need to compile the code everytime
template<>
void do_list<foo_in_type, foo_out_type>(const vector<foo_in_type>& input,
vector<foo_out_type>& output);
template<>
void do_list<bar_in_type, bar_out_type>(const vector<bar_in_type>& input,
vector<bar_out_type>& output);
实现文件如下所示:
template<typename T_IN, typename T_OUT, typename T_FUNC>
void __do_list_impl__(const vector<T_IN>& input,
vector<T_OUT>& output)
{
for (size_t i=0; i<input.size(); i++)
output.push_back(T_FUNC(input[i]));
}
template<>
void do_list<foo_in_type, foo_out_type>(const vector<foo_in_type>& input,
vector<foo_out_type>& output)
{
__do_list_impl__<foo_in_type, foo_out_type, do_foo>(input, output);
}
template<>
void do_list<bar_in_type, bar_out_type>(const vector<bar_in_type>& input,
vector<bar_out_type>& output)
{
__do_list_impl__<bar_in_type, bar_out_type, do_bar>(input, output);
}
关键是:我不想多次编写实现,因为实际的代码比这复杂得多。但是,函数不能作为模板参数传递。
那么,我应该如何解决这个问题呢?
您只需要使用函子而不是函数。
而不是将你的身体功能声明为:
T_OUT do_foo(T_IN& input) {
//your job
}
将其声明为对象类型:
class do_foo {
public:
T_OUT operator()(T_IN& input) {
//place your job code here
}
};
然后将do_list实现更改为:
template<typename T_IN, typename T_OUT, typename T_FUNC>
void __do_list_impl__(const vector<T_IN>& input,
vector<T_OUT>& output)
{
for (size_t i=0; i<input.size(); i++)
output.push_back(T_FUNC(input[i]));
}
至:
template<typename T_IN, typename T_OUT, typename T_FUNCTOR>
void __do_list_impl__(const vector<T_IN>& input,
vector<T_OUT>& output)
{
T_FUNCTOR myFunctor;
for (size_t i=0; i<input.size(); i++)
output.push_back(myFunctor(input[i]));
}
显然,也为"do_bar"函数
假设您只有少量do_list<...>()
的专用版本。。。
在您的标题中:
- 专门化不同版本的
do_list<...>()
以调用不同的非模板辅助函数do_list_impl1()
、do_list_impl2()
- 此外,声明非模板函数
do_list_impl1()
、do_list_impl2()
在您的实现文件中:
- 包括模板函数
__do_list_impl__()
的定义 - 将
do_list_impl1()
等人定义为只使用适当的模板参数调用__do_list_impl__()
相关文章:
- 从基类调用函数的多态性
- C++多态性:有没有办法找到对象成员函数的地址?
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 多态性在 lambda 函数C++不起作用
- 多态性是否适用于值?或者在按(基)值返回时使用派生类的移动构造函数
- 如何在保持多态性的同时,将成员函数添加到需要它的继承类中,而不会影响其他同级类?
- C++ 中多态性和函数重载之间的区别
- 函数模板和多态性
- C 多态性实例的构造函数和破坏者
- 多态性(C )的派生类中的超载函数
- 多态性和纯虚函数
- C++ 多态性和非虚函数
- C++多态性/虚拟函数在此不起作用
- 如果重载函数仅被部分重写,则多态性不起作用
- 多态性不适用于相同数据类型(Base和Inherited类)的函数返回值
- 具有引用数据类型的函数多态性
- c++在没有虚拟析构函数的多态性中共享ptr
- 模板函数多态性
- 基类和派生类构造函数多态性问题