Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как определить, что тип - вектор?


Автор: GoldFinch 3.7.2009, 18:05
есть функция которая распознает типы, надо добавить в нее std::vector
Код

template<typename T>
static void save(T& t)
{
    typedef
        boost::mpl::if_< boost::is_arithmetic<T>,
            save_simple,
        //else
        boost::mpl::if_< boost::is_same<std::string,T>,
            save_string,
        //else
        boost::mpl::if_< boost::is_same<std::wstring,T>,
            save_string,
        //else
        boost::mpl::if_< boost::is_array<T>,
            save_array,
        //else
        boost::mpl::if_< boost::is_pointer<T>,
            save_pointer,
        //else
            save_other
        >::type
        >::type
        >::type
        >::type
        >::type saver;
    saver::invoke(t);
}


Добавлено через 13 минут и 44 секунды
хм... очевидный ответ - перегрузить ее для std::vector
или написать 
Код

#include <boost/type_traits.hpp>

template<typename T>
struct is_vector : boost::false_type {};

template<typename T>
struct is_vector< std::vector<T> > : boost::true_type {};


Автор: Lazin 3.7.2009, 19:41
как-то так:
Код

template<typename T>
struct is_vector : boost::false_type {};


Код

template<typename T, class Allocator>
struct is_vector< std::vector<T, Allocator> > : boost::true_type {};


может лучше использовать boost::is_same?

Автор: GoldFinch 3.7.2009, 20:05
Lazin, а как использовать is_same с вектором агрументы шаблона которого неизвестны?

Добавлено через 3 минуты и 5 секунд
кроме того, я решил, что там где функцию можно перегрузить, там ее надо прегружать, например для basic_string,vector,... 
а там где ее перегрузить нельзя - там надо использовать type_traits+mpl, например для распознания указателей, массивов, простых типов и классов

Автор: Lazin 3.7.2009, 20:21
Цитата(GoldFinch @  3.7.2009,  20:05 Найти цитируемый пост)
Lazin, а как использовать is_same с вектором агрументы шаблона которого неизвестны?

я бы на твоем месте специализировал этот метод, в этом случае вывести тип вектора было-бы тривиальной задачей smile 

Автор: GoldFinch 3.7.2009, 20:30
Lazin,
template<typename T>static void save(std::vector<T>& t)  ?
я бы всеже назвал это перегрузкой нежели специализацией

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)