Я пытаюсь сократить комбинаторный рост специализаций, прозрачно передавая константу через параметр шаблона:
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, который в любом случае можно использовать из области определения класса.