2010-09-17 126 views
3

我有两个类(ClassA和ClassB),他们都有两种方法(比较和收敛)。这些方法的工作方式完全相同,但这些类不是多态关联的(出于很好的原因)。我想定义一个函数模板,这两个类都可以显式实例化为一个成员,但我得到错误,因为这些方法使用“this”,当我将它们变成模板时,编译器会抛出错误,因为它们不是成员函数。C++实例化函数模板作为类成员并使用“this”指针

因为这个限制,这是不可能的吗?还是有一些方法可以在没有声明为模板类的一部分的函数模板中使用“this”。我做了一些研究,没有发现任何东西。

Logic.h

template <class T> 
T* compare(const T& t) { 
//stuff involving this 
} 

template <class T> 
T* converge(const T& t,bool b) { 
//other stuff involving this 
} 

ClassA.cpp

#include "ClassA.h" 
#include "Logic.h" 
//constructors 

template ClassA* ClassA::compare(const ClassA& t) const; 
template ClassA* ClassA::converge(const ClassA& t,bool b) const; 
//other methods 

CLASSB是相似的。

任何帮助表示赞赏!

+0

它是_“函数模板”_,而不是“模板函数”,因为这些东西不是函数,而是可以实例化哪些函数的_templates_。 – sbi 2010-09-17 08:41:19

+0

“这些类不是多态相关的(出于很好的理由)。” - 听起来很像他们应该有一个共同的基础,如果有可能写一个兼容的成员函数。请注意,继承并不意味着多态(如私有继承)。 – Potatoswatter 2010-09-17 08:49:54

回答

2

我相信你可以在这里使用CRTP。下面是一个例子,你可以省略friend声明的情况下,你可以做的比较仅使用公共成员:

template<class T> 
class comparer 
{ 
public: 
    T* compare(const T& t) 
    { 
     //Use this pointer 
     bool b = static_cast<T*>(this)->m_b == t.m_b; 
     return NULL; 
    } 
}; 

class A : public comparer<A> 
{ 
public: 
    friend class comparer<A>; 
    A() : m_b(0) 
    { 
    } 

private: 
    int m_b; 
}; 

class B : public comparer<B> 
{ 
public: 
    friend class comparer<B>; 
    B() : m_b(0) 
    { 
    } 

private: 
    int m_b; 
}; 

int main() 
{ 
    A a1,a2; 
    A* p = a1.compare(a2); 

    B b1,b2; 
    B* p1 = b1.compare(b2); 

    return 0; 
} 
+0

给'comparer'一个受保护的非虚拟析构函数是有用的。 – 2010-09-17 12:44:59

0

不能使用这里面的非成员函数。你可以做的是创建模板函数并将它声明为你的classA和classB的一个朋友。但通过模板函数访问的classA和classB成员必须具有相同的名称。

template <typename T> 
bool compare(const T& t1, const T& t2) 
{ 
    return t1.val == t2.val; 
} 

class A 
{ 
public: 
    template <typename T> 
    friend bool compare(const T&, const T&); 

    bool compare(const A& a) 
    { 
     return ::compare(*this, a); 
    } 

private: 
    int val; 
}; 

A a1, a2; 
a1.compare(a2); 
0

你想要什么是不可能的。成员函数必须声明并定义为成员。成员函数模板也是如此,从中可以实例化成员函数。

但是(为什么)这些功能必须是成员?如果这些函数不需要访问这些类中的私有内容,请将它们设为自由函数模板。整个STL(其中,BTW仅仅是C++标准库的一部分)是围绕非成员函数构建的,并且实现了更高级别的抽象,因为任何面向前的OO容器库都会实现。
与普遍相信,non-member functions generally increase encapsulation

如果你正在编写,可以实现为成员或作为非朋友非成员函数,你应该更喜欢来实现它作为一个非成员函数。该决定增加了类封装。当你认为封装时,你应该考虑非成员函数。