我正试图通过模板参数透明地传递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
等效项,无论如何它都可以在类定义范围内使用。