c++inheritancetemplate-meta-programmingc++20conversion-operator

Inheriting a templated conversion operator


Consider the following code:

template <class R, class... Args>
using function_type = R(*)(Args...);

struct base {
    template <class R, class... Args>
    constexpr operator function_type<R, Args...>() const noexcept {
        return nullptr;
    }
};

struct derived: private base {
    template <class R, class... Args>
    using base::operator function_type<R, Args...>; // ERROR
};

Is there a working alternative in C++20 to inherit and expose a templated conversion function?


Solution

  • GCC support this: [demo]

    template <class R, class... Args>
    using function_type = R(*)(Args...);
    
    struct base {
        template <class R, class... Args>
        constexpr operator function_type<R, Args...>() const noexcept {
            return nullptr;
        }
    };
    
    struct derived: private base {
      
        using base::operator function_type<auto, auto...>; // No error!
    };
    
    
    int main (){
      derived d;
      static_cast <int(*)(int)>(d);
    }
    

    But I think this is an extension to the language that may come from the concept-TS.