Повторние кода шаблонов
От: na1s  
Дата: 15.08.09 06:50
Оценка:
Есть код, который работает с мапом туплов.
Нужно написать мапы для туплов от 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");
    }
};
Re: Повторние кода шаблонов
От: Юрий Жмеренецкий ICQ 380412032
Дата: 15.08.09 07:17
Оценка: 1 (1)
Здравствуйте, 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;
Re: Повторние кода шаблонов
От: Roman Odaisky Украина  
Дата: 15.08.09 07:45
Оценка: +1
Здравствуйте, na1s, Вы писали:

N>Есть код, который работает с мапом туплов.

N>Нужно написать мапы для туплов от 1 до 5 параметров.
N>Т.е. из кода ниже надо менять только typedef Tuple <T1> keys на typedef Tuple <T1,T2> keys, и так до 5 параметров.

Лучшее решение — variadic templates, если компилятор позволяет (GCC 4.3, теоретически MSVC 2010). Если не получится, то можно еще генерировать код с помощью Boost.Preprocessor. Или вариант Юрия.
До последнего не верил в пирамиду Лебедева.
Re[2]: Повторние кода шаблонов
От: na1s  
Дата: 15.08.09 07:47
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Здравствуйте, 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");
Re: Повторние кода шаблонов
От: rg45 СССР  
Дата: 15.08.09 08:30
Оценка: +1
Здравствуйте, 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;

Тип результата вот только пришлось поставить в шаблоне первым параметром, но, может, оно и лучше?
--
Re[3]: Повторние кода шаблонов
От: Юрий Жмеренецкий ICQ 380412032
Дата: 15.08.09 08:41
Оценка:
Здравствуйте, 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)
{
 //...
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.