Здравствуйте, Andrew001, Вы писали:
A>Есть некая функция которую нужно сделать элементом нескольких классов A>1 — это сделать родительский класс в котором и объявить эту функция A>2 — это сделать глобальную функцию к которой обращаться из промежуточных функций-членов этих классов A>Оба эти варианта не очень подходят A>Какие еще есть варианты? A>Возможно ли это сделать через шаблоны?
Можно сделать миксин (класс-примесь) и добавить его с помощью идиомы CRTP во все интересующие классы
// CRTP-заготовка для всех миксиновtemplate<class T>
struct mixin
{
T& self() { return static_cast<T&>(*this); }
T const& self() const { return static_cast<T&>(*this); }
};
// наш миксин, реализующий функцию foo
// это паттерн проектирования "Шаблонный метод"
// только без виртуальности, а на полиморфизме времени компиляцииtemplate<class T>
struct foo_mixin : mixin<T>
{
void foo()
{
this->self().bar(); // this-> нужен для того, чтобы искать имя self в контексте класса, а не где попалоthis->self().buz(); // хотя VC к этому относится терпимее, чем comeau
}
};
// нахлобучиваем миксин на наш классclass A : public foo_mixin<A>
{
private:
friend class foo_mixin<A>;
void bar();
void buz();
public:
};
///////////////////////////////////////////////
// или вот так ещёtemplate<class T>
struct foo_object : T
{
void foo()
{
this->bar();
this->buz();
}
};
class B_proto
{
public:
void bar();
void buz();
};
// нахлобучиваем миксин поверх класса-прототипаtypedef foo_object<B_proto> B;
//////////////////////////////////////////////////
// окончательно разнесём миксин и прототип
// foo_object можно сделать и такtemplate<class T, template<class>class Mixin>
struct object : T, Mixin< object<T,Mixin> >
{};
typedef object<B_proto, foo_mixin> C;
int main()
{
A().foo();
B().foo();
C().foo();
}
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Включение одной функции в несколько классов
Есть некая функция которую нужно сделать элементом нескольких классов
1 — это сделать родительский класс в котором и объявить эту функция
2 — это сделать глобальную функцию к которой обращаться из промежуточных функций-членов этих классов
Оба эти варианта не очень подходят
Какие еще есть варианты?
Возможно ли это сделать через шаблоны?
Здравствуйте, Andrew001, Вы писали:
A>Есть некая функция которую нужно сделать элементом нескольких классов A>1 — это сделать родительский класс в котором и объявить эту функция A>2 — это сделать глобальную функцию к которой обращаться из промежуточных функций-членов этих классов A>Оба эти варианта не очень подходят A>Какие еще есть варианты? A>Возможно ли это сделать через шаблоны?
Возможно, например:
#include <iostream>
#include <string>
template<typename T, typename V>
void set_value(T& item, const V& value)
{
item.value = value;
}
struct A
{
int value;
};
struct B
{
std::string value;
};
int main()
{
A a;
B b;
set_value(a, 123);
set_value(b, "hello");
std::cout << a.value << std::endl; //output: "123"
std::cout << b.value << std::endl; //output: "hello"
}
--
Re[2]: Включение одной функции в несколько классов
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Andrew001, Вы писали:
A>>Есть некая функция которую нужно сделать элементом нескольких классов A>>1 — это сделать родительский класс в котором и объявить эту функция A>>2 — это сделать глобальную функцию к которой обращаться из промежуточных функций-членов этих классов A>>Оба эти варианта не очень подходят A>>Какие еще есть варианты? A>>Возможно ли это сделать через шаблоны?
R>Возможно, например: R>