c++ template meta programming: how do you define the type trait "is_xxxxx_v" alias for my custom trait?

So I have been looking through this: https://akrzemi1.wordpress.com/2017/12/02/your-own-type-predicate/

It shows that you can take a custom trait (or predicate) is_thing<T>::type and alias that to is_thing_t<T> – e.g.:

template <bool Cond>
using enable_if_t = typename enable_if<Cond>::type;

Now I want to do the same trick to implement the value alias used in other traits. I have a snippet of code below with my attempt:

// Primary template
// tparam 1 (T) is to pass in the class-under-test. 
// tparam 2 (deafult to void) is to catch all cases not specialised - so they evaluate to false
template <typename T, typename = void>
struct is_really_bob : std::false_type {};

// specialisation
// tparam 1 (T) is to pass in the class-under-test. 
// tparam 2 special meta-function that - if our class best-matches THIS template then it will evaluate to true
template <typename T>
struct is_really_bob <T, std::void_t<
    typename T::result_type,                 // Has a nested type called result_type
    decltype(T::check_bob()),                // Has a static member fn called check_bob
    decltype(std::is_default_constructible_v<T>), // required for below:
    decltype(T{}.set_bob(std::string{""})),  // has member fn set_bob that takes a string (also requires default c'tor)
    decltype(T{}.get_bob())                  // has member fn get_bob (also requires default c'tor)
>> : std::true_type {};

///// THIS FAILS /////
template <bool T>
using is_really_bob_v = typename is_really_bob<T>::value;

The problem here is that ::value is not a type name. I don’t know the syntax to generate a value alias. Is there a way to do this? I want to end up being able to do something like:

if constexpr (is_really_bob_v<T>)
{
    // ...
}

Full code example is here: https://godbolt.org/z/dG11vxesW – not it has the attempt at ::value alias commented out so we can at least see the rest of the code working

Source: Windows Questions C++

2 thoughts on - c++ template meta programming: how do you define the type trait "is_xxxxx_v" alias for my custom trait?

LEAVE A COMMENT