我想知道在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();
}
我想知道它是否合适?
答案 0 :(得分:6)
这是模板功能的完全合法使用。此外,使用非模板类的模板化成员函数也没有问题。例如:
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" );
答案 1 :(得分:4)
如果成员函数在逻辑上属于您的类,并且模板类型仅特定于该函数(并且与您的其他类没有任何关系),我认为没有任何理由不这样做。< / p>
答案 2 :(得分:1)
模板化函数是一种使用不同参数类型重载它的简单方法,这是完全可以接受的。从这个意义上说,在非模板类中模拟单个成员函数,或者从非模板类调用模板函数甚至是可以接受的。关于它没有任何含糊之处
答案 3 :(得分:1)
如果您有许多具有相似签名的方法,只能按类型进行更改,则可以使用模板方法:
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
允许方法,函数或算法在不改变算法的情况下对不同类型的对象进行操作。这也适用于接口。
答案 4 :(得分:1)
是的,它很好,当然像往常一样,你最好尽可能多地分解模板。
例如:
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;
};
这减轻了用户膝盖转换的乏味。