Reputation: 10556
I'm sure that boost has some functions for doing this, but I don't know the relevant libraries well enough. I have a template class, which is pretty basic, except for one twist where I need to define a conditional type. Here is the psuedo code for what I want
struct PlaceHolder {};
template <typename T>
class C {
typedef (T == PlaceHolder ? void : T) usefulType;
};
How do I write that type conditional?
Upvotes: 5
Views: 1641
Reputation: 5551
In modern C++ using the convenience templates std::conditional_t
and std::is_same_v
:
using usefulType = std::conditional_t<std::is_same_v<T, PlaceHolder>, void, T>;
In C++11, using only typedef
and without the convenience aliases:
typedef typename std::conditional<std::is_same<T, PlaceHolder>::value, void, T>::type
usefulType;
Upvotes: 10
Reputation: 40897
template < typename T >
struct my_mfun : boost::mpl::if_
<
boost::is_same<T,PlaceHolder>
, void
, T
> {};
template < typename T >
struct C { typedef typename my_mfun<T>::type usefulType; };
Upvotes: 2
Reputation: 35921
I think this is the principle you're after:
template< class T >
struct DefineMyTpe
{
typedef T usefulType;
};
template<>
struct DefineMyType< PlaceHolder >
{
typedef void usefulType;
};
template< class T >
class C
{
typedef typename DefineMyType< T >::usefulType usefulType;
};
Upvotes: 6