Есть код, который работает с мапом туплов.
Нужно написать мапы для туплов от 1 до 5 параметров.
Т.е. из кода ниже надо менять только typedef Tuple <T1> keys на typedef Tuple <T1,T2> keys, и так до 5 параметров.
Как-нибудь можно избавиться от лишнего copy-paste?
#include "tuple.h"
#include <map>
template<typename T1,typename TRes>
class tuples_map
{
typedef Tuple<T1> keys;
public:
tuples_map()
:initialized(false){
}
private:
keys current_key;
bool initialized;
std::map<keys,TRes> tupled_map;
public:
//примерные методы работы с мапом
void setKey(keys const & key)
{
initialized=true;
current_key=key;
}
void addData(TRes data)
{
if (initialized)
tupled_map[current_key]=data;
else
throw range_error("map hasn't been setted key");
}
};
Здравствуйте, na1s, Вы писали:
N>Есть код, который работает с мапом туплов.
N>Нужно написать мапы для туплов от 1 до 5 параметров.
N>Т.е. из кода ниже надо менять только typedef Tuple <T1> keys на typedef Tuple <T1,T2> keys, и так до 5 параметров.
N>Как-нибудь можно избавиться от лишнего copy-paste?
Передавать в tuples_map уже готовый набор:
typedef tuples_map<Tuple<T1, T2,...>, U> Map;
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Здравствуйте, na1s, Вы писали:
N>>Есть код, который работает с мапом туплов.
N>>Нужно написать мапы для туплов от 1 до 5 параметров.
N>>Т.е. из кода ниже надо менять только typedef Tuple <T1> keys на typedef Tuple <T1,T2> keys, и так до 5 параметров.
N>>Как-нибудь можно избавиться от лишнего copy-paste?
ЮЖ>Передавать в tuples_map уже готовый набор:
ЮЖ>typedef tuples_map<Tuple<T1, T2,...>, U> Map;
Можно пример7
Т.е. просто писать:
tuples_map<Tuple<int,int,int>, string> t;
t.setKey(make_tuple(1,1,1));
t.addData("string");
Здравствуйте, na1s, Вы писали:
N>Есть код, который работает с мапом туплов.
N>Нужно написать мапы для туплов от 1 до 5 параметров.
N>Т.е. из кода ниже надо менять только typedef Tuple <T1> keys на typedef Tuple <T1,T2> keys, и так до 5 параметров.
N>Как-нибудь можно избавиться от лишнего copy-paste?
В условиях, когда variadic templates недоступны, а "красивости" все же хочется, я бы вынес всю реализацию в базовый шаблонный класс
tuples_map_base, параметризуемый готовым типом тупла, как советовал Юрий Жмеренецкий. А для класса
tuples_map написал бы необходимое количество специализаций:
template<typename TRes, typename TTuple>
class tuples_map_base
{
typedef TTuple keys;
public:
//...
};
template<typename T1, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void> class Tuple{};
template<typename TRes, typename T1, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void>
class tuples_map : public tuples_map_base<TRes, Tuple<T1, T2, T3, T4, T5> > {};
template<typename TRes, typename T1, typename T2, typename T3, typename T4>
class tuples_map<TRes, T1, T2, T3, T4, void> : public tuples_map_base<TRes, Tuple<T1, T2, T3, T4> > {};
template<typename TRes, typename T1, typename T2, typename T3>
class tuples_map<TRes, T1, T2, T3, void, void> : public tuples_map_base<TRes, Tuple<T1, T2, T3> > {};
template<typename TRes, typename T1, typename T2>
class tuples_map<TRes, T1, T2, void, void, void> : public tuples_map_base<TRes, Tuple<T1, T2> > {};
template<typename TRes, typename T1>
class tuples_map<TRes, T1, void, void, void, void> : public tuples_map_base<TRes, Tuple<T1> > {};
Теперь можно пользоваться:
tuples_map<bool, int> m1;
tuples_map<bool, int, double> m2;
tuples_map<bool, int, double, const char*> m3;
tuples_map<bool, int, double, const char*, long> m4;
tuples_map<bool, int, double, const char*, long, float> m5;
Тип результата вот только пришлось поставить в шаблоне первым параметром, но, может, оно и лучше?
Здравствуйте, na1s, Вы писали:
...
N>Т.е. просто писать:
N>N>tuples_map<Tuple<int,int,int>, string> t;
N>t.setKey(make_tuple(1,1,1));
N>t.addData("string");
N>
Да, именно так. Разница (если сравнивать с tuples_map<T1, T2,... U>) только в первой строке. Автоматом появляется возможность писать так:
// Одна функция
template<class T, class U>
void f(const tuples_map<T, U>& ref)
{
//...
}