Как сделать универсальный метод класса? - PullRequest
0 голосов
/ 29 сентября 2011

Есть ли способ сделать функцию шаблона класса?

Так например

//Warning: this is conceptual pseudo-code

template<typename TemplateClass, TemplateItem>
TemplateClass &TemplateClass::operator=(TemplateItem &B)
{
   Item = B.Item;
   return *this;
}

//or...

template<typename TemplateClass, TemplateItem>
TemplateClass &TemplateClass::Assignment(TemplateItem &B)
{
   Item = B.Item;
   return *this;
}

Assignment<TestA,TestB>(B);

Или что-то в этом роде.

Я буду комментировать не только для заданий.

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Вы не можете добавить что-либо в определение класса.Вы не можете заставить класс иметь конкретную функцию-член.Как только вы поместите ; в определение класса, оно будет определено и не может быть изменено.Поэтому, если вы хотите иметь член класса, он должен быть объявлен в пределах определения класса.

Теперь общий способ расширить функциональность, подобную этой, - это использовать нефункция-член:

template<typename ClassName, typename Other>
ClassName &SomeFunc(ClassName &myType, const Other &theOther);

Эта функция вернет myType.

Очевидно, что это не поможет операторам, которые должны быть членами класса, например, присваивания.Но с этим ничего не поделаешь.Самое большее, что вы можете сделать, это заставить оператор присваивания вызвать функцию, не являющуюся членом, поэтому вся реальная работа будет продолжена.

Но это лучшее, что вы можете сделать.

1 голос
/ 29 сентября 2011

Я уверен, что меня поразит группа "препроцессор - зло", но я думаю, что вы ищете что-то вроде этого:

#define DEFINE_ASSIGNMENT(mainClass,memberClass,member)        \
mainClass & mainClass::operator = (const memberClass & rhs)    \
{                                                              \
    member=rhs.member;                                         \
    return *this;                                              \
}

DEFINIE_ASSIGNMENT(TestA,TestB,Item)
...