pythonic metaphor
pythonic metaphor

Reputation: 10556

How to conditionally define a typedef to be one of two types

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

Answers (3)

rafak
rafak

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

Edward Strange
Edward Strange

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

stijn
stijn

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

Related Questions