vendredi 31 mai 2019

Template Argument Binding

What I want is something like std::bind for functions but for templates. Assume I have a template which needs a template template with a defined set of arguments. Now I have another template which would work but which has more arguments, so I need to convert this complex template into a simpler one with bound arguments.

To do this I created a template which defines an alias template.

If I use this binding template with concrete types this works well. But if I instantiate the binding template with another template argument, gcc and clang assume that the alias is not a template template. I know it becomes a dependent name, but there is nothing like the typename disambiguator for templates.

With icc and msvc this works fine.

template<
    template<typename> typename Template 
>
class ATypeWhichNeedsATemplateTemplate
{
};

template<typename A, typename B>
class AComplexTemplate
{
};

template<
    template<typename...> typename ATemplate 
    ,typename... Args
>
class Binder {
public:
    template<typename T>
    using type = ATemplate<T, Args...>;
};

template<typename T>
class AClassWithBoundTemplate : public ATypeWhichNeedsATemplateTemplate<
    Binder<AComplexTemplate, T>::type
>
{    
};

see on godbolt

clang complains:

<source>:30:5: error: template argument for template template parameter must be a class template or type alias template

    Binder<AComplexTemplate, T>::type

    ^

gcc says something similar:

<source>:31:1: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class Template> class ATypeWhichNeedsATemplateTemplate'

 >

 ^
<source>:31:1: note:   expected a class template, got 'Binder<AComplexTemplate, T>::type'

Aucun commentaire:

Enregistrer un commentaire