我有一些基于编译时间常数的模板,如下所示:

const int SIG0 = 0;

template<int Sig>
struct SignalPrototype;

template<>
struct SignalPrototype<SIG0> {
  typedef std::function< void() > type;
};

当我尝试将其转换为C++ 11(我相信)Alias声明时,我无法使其以任何形状或形式工作(仅发布其中之一):
const int SIG0 = 0;

template<int Sig>
using SignalPrototype = std::function< void() >;

template<>
using SignalPrototype<SIG0> = std::function< void() >;

错误:expected unqualified-id before ‘using’我猜它在模板参数中期望一些东西,但是我不能把SIG0放进去,因为它不是一种类型。

笔记:
我使用的是C++标准直到C++ 17,因此,我不知道的任何新事物也将受到赞赏。

另外,我不喜欢标题中的“这些”,但我不知道它们的具体名称是什么。

最佳答案

这里有几处错误。const int SIG0 = 0;必须是constexpr,而不是const
然后你cannot specialize alias templates

您可以做的是将这两种方法结合起来:

constexpr int SIG0 = 0;

template <int Sig> struct SignalPrototype;
template<> struct SignalPrototype<SIG0> {
  typedef std::function< void() > type;
};

template <int Sig>
using SignalPrototype_t = typename SignalPrototype<Sig>::type;

09-13 04:03