【问题标题】:Is it good to have a member template function inside a non-template class in c++?在 c++ 中的非模板类中拥有成员模板函数是否很好?
【发布时间】:2011-02-03 11:28:30
【问题描述】:
我想知道在 C++ 中的非模板类中包含成员模板函数是否是一种好习惯?为什么?
我正在尝试做这样的事情
in classA.h:
classA
{
public:
member_func1();
member_func2();
};
in classA.cpp:
template <class T> share_func();
classA::member_func1()
{
call share_func();
}
classA::member_func2()
{
call share_func();
}
不知是否合适?
【问题讨论】:
标签:
c++
class
templates
function
【解决方案1】:
这是对模板函数的完全合法使用。此外,使用非模板类的模板化成员函数也没有问题。例如:
class A {
public:
void say_hello() { cout << "Hello World" << endl; }
template<T> print_it( T arg ) { cout << "Argument: " << arg << endl; }
};
...
A a;
a.say_hello();
a.print_it( 3.14159 );
a.print_it( "A string" );
【解决方案2】:
如果成员函数在逻辑上属于您的类,并且模板类型仅特定于该函数(并且与您的类的其余部分无关),我认为没有任何理由不这样做。
【解决方案3】:
模板化一个函数是一种用不同参数类型重载它的简单方法,这是完全可以接受的。从这个意义上说,甚至可以在非模板类中模板化单个成员函数,或者从非模板类调用模板函数。没有什么暧昧的地方
【解决方案4】:
如果您有许多具有相似签名的方法,只是因类型而异,则可以使用模板方法:
struct Example
{
void load_from(std::istream&);
void load_from(Database_Table&);
void load_from(Some_Device&);
};
模板方法允许一些扩展:
struct Example_Template_Method
{
template <class Input_Source>
void load_from(Input_Source&);
};
这里的关键点是template 允许方法、函数或算法在不更改算法的情况下对不同类型的对象进行操作。这也适用于接口。
【解决方案5】:
是的,这很好,当然,像往常一样,您最好尽可能多地从模板中分解出来。
例如:
class Tokens
{
public:
void add(const char* c);
void add(const std::string& s);
template <class T>
void add(T const& t)
{
this->add(boost::lexical_cast<std::string>(t));
}
private:
std::vector<std::string> mTokens;
};
这从用户的膝上减轻了转换的乏味。