如何实现几个函数的编译时多态?

时间:2014-10-17 09:05:12

标签: c++ templates

似乎我应该使用函数作为模板参数,但不能以这种方式完成。

头文件如下所示:

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);
}

关键是:我不想多次编写实现,因为实际代码比这复杂得多。但是,该函数不能作为模板参数传递。

那么,我应该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您只需使用仿函数而不是函数。

而不是将你的身体功能声明为:

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]));
}

显然也为&#34; do_bar&#34;创建了一个新课程。功能

答案 1 :(得分:0)

假设您只有少量专业版do_list<...>() ...

在标题中:

  1. 专门调整do_list<...>()的不同版本以调用其他版本 非模板辅助函数do_list_impl1()do_list_impl2(),...
  2. 另外,声明非模板函数do_list_impl1()do_list_impl2(),...
  3. 在您的实施文件中:

    1. 包含模板函数__do_list_impl__()
    2. 的定义
    3. 定义do_list_impl1()等,只需使用适当的模板参数调用__do_list_impl__()