我有一些基于编译时间常数的模板,如下所示:
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;