10

Template aliases are very convenient in simplifying types like typename F <T>::type to just F <T>, where T and type are types.

I would like to do the same for templates like F <T>::map, i.e., simplify them to F <T>, where T and map are template structs or aliases.

For instance, consider the following definitions:

template <bool B>
using expr = std::integral_constant <bool, B>;

template <bool B>
using _not = expr <!B>;

template <template <typename> class F>
struct neg_f
{
    template <typename T>
    using map = _not <F <T>{}>;
};

template <typename T>
pred = expr < /* ... T ... */ >;  // e.g., pred = expr <true>;

template <template <typename> class F>
struct fun;

Now the following works:

fun <neg_f <pred>::map>

This would be much more convenient, but it fails:

template <template <typename> class F>
using neg = neg_f <F>::map;

fun <neg <pred> >

(It also fails with neg = neg_f <F>::template map, even if map is defined as a struct). It appears that the definition of neg above would rather have to be like a "template template alias"

template <template <typename> class F>
template <typename T>
using neg = neg_f <F>::template map <T>;

but apparently there is no such thing.

So, is there any solution or should I stay with neg_f <pred>::map ?

iavr
  • 7,547
  • 1
  • 18
  • 53
  • 1
    I asked a similar question http://stackoverflow.com/questions/17356487/equivalent-of-using-aliases-for-templates and there doesn't seem to be a good answer. – Yakk - Adam Nevraumont Sep 09 '13 at 14:05
  • Indeed, the last part of your question is very similar or the same. Thanks. – iavr Sep 09 '13 at 14:23
  • 4
    Your using of spaces before `<` makes everything extremely unpleasant to read, for some reasons. – Shoe Jan 16 '14 at 20:57
  • 1
    @Jeffrey I am sorry for this. On the other hand, I would find `template – iavr Jan 20 '14 at 03:36
  • I do not understand what those neg_f and other stuff represent, if you described that somewhat better perhaps we could come up with a solution – Marco A. Mar 16 '14 at 21:20
  • Also: I don't see how that can compile with {} (initializing an object in a declaration) – Marco A. Mar 16 '14 at 21:29
  • @DavidKernin My apologies, `neg_f` is supposed to *negate* a type predicate, that is, `neg_f::map` is another type predicate that, when applied to a type `T`, gives the complement of whatever `F` gives. I didn't explain because its definition is so simple and because it's just a example, it's not essential to the problem (I could equally use a `foo`-like example). – iavr Mar 16 '14 at 21:40
  • @DavidKernin On `_not {}>`: `F` is a type predicate, i.e. `F` is `std::integral_constant` for some `B` as shown by the definitions. Meaning that `F{}` is an object of literal type that is implicitly converted to `bool`, in turn used as non-type template parameter for `_not`. I hope this helps. – iavr Mar 16 '14 at 21:47

1 Answers1

1

At first consider using typename keyword to state that this is a nested type no matter if one is a type (e.g. struct, class, etc), template type, typedef or alias.

Alias specification requires you to use a type-id to specify a previously defined type. In this particular case correct using of type-id will look like this:

template< template<typename> class F, class T>
using neg_v2 = typename neg_f<F>::template map<T>;

// or

struct foo {};
template< template<typename> class F>
using neg_v1 = typename neg_f<F>::template map<foo>;

What you try to do originally is to use template-name neg_f<F>::mapas a type-id. This is not correct.

Probably you want to deduce somehow the T parameter from F to be used at template map<T> but this is not applicable to your final use-case fun<neg<pred>> where T is not resolved.

slk
  • 86
  • 3
  • So the error list shows the root cause. See my edits to the answer. – slk Apr 16 '14 at 09:06
  • I didn't try to use template-name neg_f::map as a type-id. You did that. – iavr Apr 16 '14 at 09:41
  • here is your try to use a template-name `neg_f ::map` as a type-id ;) `template – slk Apr 16 '14 at 09:51
  • This was hypothetical code to illustrate the question, if you read the entire sentence. Anyway, I removed the downvote. – iavr Apr 16 '14 at 10:07