似乎我应该将function用作模板参数,但是不能以这种方式完成。
头文件如下所示:
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);
}
关键是:我不想多次编写实现,因为实际代码比这要复杂得多。但是,该函数不能作为模板参数传递。
那么,我应该如何解决呢?
最佳答案
您只需要使用functor而不是一个函数。
而不是声明您的 body 功能为:
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”功能创建了一个新类
关于c++ - 如何实现几个函数的编译时多态?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26421556/