是否允许带有非推导模板参数签名的成员函数声明?

时间:2019-02-05 14:25:28

标签: c++ templates

我正试图通过模板参数透明地传递const-ness来减少专业的组合爆炸式发展:

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; };

或者,在C ++ 17中,const提取noexcept的过程中是否有可用的东西?

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在C ++ 17中没有神奇的if constexpr等效项,无论如何它都可以在类定义范围内使用。

0 个答案:

没有答案