Специализация для enum
От: buka123  
Дата: 04.05.10 06:21
Оценка:
template<typename T>
class BindParametr
{
public:
BindParametr(SQLStatement st, T value):m_value(value)
{
st.BindParam(&m_value);
}
private:
T m_value;
};

Для каждого enum приходиться писать специализацию с кастингом до int:
template<>
class BindParametr<Enum1>
{
public:
BindParametr(SQLStatement st, Enum1 value):m_value((int)value)
{
st.BindParam(&m_value);
}
private:
int m_value;
};

Как можно этого избежать?
Re: Специализация для enum
От: night beast СССР  
Дата: 04.05.10 06:35
Оценка:
Здравствуйте, buka123, Вы писали:


B>template<typename T>
B>class BindParametr
B>{
B>public:
B>    BindParametr(SQLStatement st, T value):m_value(value)
B>    {
B>        st.BindParam(&m_value);
B>    }
B>private:
B>    T m_value;
B>};



B>Для каждого enum приходиться писать специализацию с кастингом до int:

B>template<>
B>class BindParametr<Enum1>
B>{
B>public:
B>    BindParametr(SQLStatement st, Enum1 value):m_value((int)value)
B>    {
B>        st.BindParam(&m_value);
B>    }
B>private:
B>    int m_value;
B>};



B>Как можно этого избежать?


это делается через type_traits:

template<typename To, typename From> To integer_cast ( From const & );
template<typename T> T const & integer_cast<T,T> ( T const & );

template< typename T >
struct type_traits {
   typedef T value_type;
};

template<> 
struct type_traits<Enum1> {
   typedef int value_type;
};

template<typename T>
class BindParametr
{
    typedef typename type_traits<T>::value_type value_type;
public:
    BindParametr(SQLStatement st, T value) : m_value( integer_cast<value_type> (value) )
    {
        st.BindParam(&m_value);
    }
private:
    value_type m_value;
};



только зачем для enum такая специализация?
Re: Специализация для enum
От: remark Россия http://www.1024cores.net/
Дата: 04.05.10 06:36
Оценка: +1
Здравствуйте, buka123, Вы писали:

B>Для каждого enum приходиться писать специализацию с кастингом до int:

B>Как можно этого избежать?

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_enum.hpp>
using namespace boost;

template<typename T, typename U = void>
struct parameter;

template<typename T>
struct parameter<T, enable_if<is_enum<T>, void>::type>
{
};

enum enum1 {};
enum enum2 {};
struct X {};

int main()
{
    parameter<enum1> p1;
    parameter<enum2> p2;
    parameter<int> p3;
    parameter<X> p4;
}



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Специализация для enum
От: buka123  
Дата: 04.05.10 06:39
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, buka123, Вы писали:



NB>
B>>template<typename T>
B>>class BindParametr
B>>{
B>>public:
B>>    BindParametr(SQLStatement st, T value):m_value(value)
B>>    {
B>>        st.BindParam(&m_value);
B>>    }
B>>private:
B>>    T m_value;
B>>};
NB>



B>>Для каждого enum приходиться писать специализацию с кастингом до int:

NB>
B>>template<>
B>>class BindParametr<Enum1>
B>>{
B>>public:
B>>    BindParametr(SQLStatement st, Enum1 value):m_value((int)value)
B>>    {
B>>        st.BindParam(&m_value);
B>>    }
B>>private:
B>>    int m_value;
B>>};
NB>



B>>Как можно этого избежать?


NB>это делается через type_traits:


NB>
NB>template<typename To, typename From> To integer_cast ( From const & );
NB>template<typename T> T const & integer_cast<T,T> ( T const & );

NB>template< typename T >
NB>struct type_traits {
NB>   typedef T value_type;
NB>};

NB>template<> 
NB>struct type_traits<Enum1> {
NB>   typedef int value_type;
NB>};

NB>template<typename T>
NB>class BindParametr
NB>{
NB>    typedef typename type_traits<T>::value_type value_type;
NB>public:
NB>    BindParametr(SQLStatement st, T value) : m_value( integer_cast<value_type> (value) )
NB>    {
NB>        st.BindParam(&m_value);
NB>    }
NB>private:
NB>    value_type m_value;
NB>};
NB>



NB>только зачем для enum такая специализация?

В том то и дело, что не только для enum, а также для string, int и прочих. А тут получается только для enum
Re[3]: Специализация для enum
От: night beast СССР  
Дата: 04.05.10 06:53
Оценка:
Здравствуйте, buka123, Вы писали:

NB>>это делается через type_traits:



NB>>template<typename T>
NB>>class BindParametr
NB>>{
NB>>    typedef typename type_traits<T>::value_type value_type;
NB>>public:
NB>>    BindParametr(SQLStatement st, T value) : m_value( integer_cast<value_type> (value) )
NB>>    {
NB>>        st.BindParam(&m_value);
NB>>    }
NB>>private:
NB>>    value_type m_value;
NB>>};



NB>>только зачем для enum такая специализация?

B>В том то и дело, что не только для enum, а также для string, int и прочих. А тут получается только для enum

не понял что значит "только для enum"?

делай специализацию type_traits для string и пользуйся, в чем проблема?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.