Разрешены ли объявления функций-членов с подписями из не выведенных параметров шаблона? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь сократить комбинаторный рост специализаций, прозрачно передавая константу через параметр шаблона:

template <typename Sig>
struct IFoo { virtual Sig operator() = 0; }; // XXX, but OK with non-templated aliases...

Компиляторы обрабатывают Sig как нефункциональный тип перед его реализацией, поэтомуЯ думаю, что я просто ищу способ вывести систему из раннего представления о типе.Разве это не возможно, или я просто еще не наткнулся на правильную грамматику?

Я явно хочу избежать обычного стиля вывода, вызванного специализацией:

template <typename Sig> struct IFoo;

template <typename R, typename... Args>
struct IFoo<R(Args...)> { virtual R operator()(Args...) = 0; };

template <typename R, typename... Args>
struct IFoo<R(Args...) const> { virtual R operator()(Args...) const = 0; };

Альтернативно, есть личто-нибудь доступное для const в соответствии с извлечением noexcept, доступным в C ++ 17?

template <typename Sig> struct IBar;

template <typename R, typename... Args, bool IsNoExcept>
struct IBar<R(Args...) noexcept(IsNoExcept)> {
    virtual R operator()(Args...) noexcept(IsNoExcept) = 0;
};

Я, к сожалению, застрял в C ++ 14, но AFAIK нет волшебства if constexpr эквивалент в C ++ 17, который в любом случае можно использовать из области определения класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...