Здравствуйте, 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 такая специализация?
Здравствуйте, 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;
}
Здравствуйте, 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
Здравствуйте, 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 и пользуйся, в чем проблема?