64,637
社区成员
发帖
与我相关
我的任务
分享
template < typename T >
class TraitSet;
template<>
class TraitSet< int >
{
public:
typedef int TypeT;
};
template<>
class TraitSet< long >
{
public:
typedef long TypeT;
};
................. //有很多trait
template< typename T >
class DefaultAction
{
public :
............
static T GetData( void )
{
if( typeid( T ) == typeid( int ) )
{
return 10;
}
if( typeid( T ) == typeid( long ) )
{
return 20;
}
..................... //有很多个typeid
return T( );
}
...............
};
........................ //有一些policy,每个policy都有GetData
template< typename T,
typename Policy = DefaultAction< T >,
template < typename > class Trait = TraitSet >
class ResultSet
{
public :
..............
static T GetResult( void )
{
..............
typename Trait<T>::TypeT Data = Policy::GetData( );
...............
return Data;
}
............
};
template<typename T>
struct type_tag{};
template<typename T>
struct default_action
{
typedef T value_type;
value_type operator()(const type_tag<int>&) const
{
return 10;
}
value_type operator()(const type_tag<long>&) const
{
return 20;
}
};
template<typename T, typename Action = default_action<T> >
struct result_extract
{
typedef T value_type;
typedef Action action_type;
typedef result_extract self_type;
value_type operator()() const
{
return self_type()( type_tag<T>() );
}
private:
value_type operator()(const type_tag<int>& tag) const
{
return action_type()( tag );
}
value_type operator()(const type_tag<long>& tag) const
{
return action_type()( tag );
}
};
#include <iostream>
int main()
{
std::cout << result_extract<int>()() << "\n";
std::cout << result_extract<long>()() << "\n";
return 0;
}
namespace for_actions
{
template<typename T>
struct def_value
{
T value;
};
template<>
struct def_value<int>
{
enum{value = 10};
};
template<>
struct def_value<long>
{
enum{value = 20};
};
}
template< typename T >
class DefaultAction
{
public :
typedef for_actions::def_value<T> data_reader;
};
struct A
{
A(const std::string& s);
};
namespace for_actions
{
template<>
struct def_value<A>
{
A value;
def_value()
: value("构造你妹")
{}
};
}
int main()
{
DefaultAction<A>::data_reader().value;
std::system("pause");
}
/////////////////////
static T GetResult( void )
{
..............
typename Trait<T>::TypeT Data = typename Policy::data_reader().value;
...............
return Data;
}