2017-01-10 44 views
1

我基于编译时间常数得到了一些模板,就像这样:转化这些模板别名声明

const int SIG0 = 0; 

template<int Sig> 
struct SignalPrototype; 

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

当我试图把它转变成C++ 11(我相信)别名声明,我无法得到它在任何形状或形式(张贴只是其中之一)工作:

const int SIG0 = 0; 

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

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

与错误:expected unqualified-id before ‘using’ 我猜它期待在模板参数的东西,但我可以” t把SIG0,因为它不是一个类型。我使用的C++标准高达C++ 17,所以任何新的我不知道的东西,也是赞赏。

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

回答

3

这里有几件事情是错误的。 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; 
+0

我确实能做到这一点,我会看它是否适合我特定的代码 - 或者甚至与可读性帮助(这主要是我之后) – areuz

+1

@areuz C++ 14中的'std'命名空间包含了很多别名,比如我建议的'SignalPrototype_t',这些在C++ 11中都没有。所以人们觉得它们很有用。我也自己使用它们,因为它们可以让你始终不用输入'typename'和':: type'。以下是来自'type_traits'标头的一些示例:http://en.cppreference.com/w/cpp/header/type_traits向下滚动“概要”部分。 – SU3