具有多个参数和默认参数的类模板

问题描述 投票:0回答:1

我有一个这样的类模板:

struct Relay
{
    int pin;
    bool state;
};

template<std::size_t N, uint8_t D = 10>
class RelayArray
{
private:
    Relay array[N]; //or std::array<Relay, N>
public:
    RelayArray(const Relay(&ref)[N]) 
    {}
};

RelayArray myRelayArray{{{2, true}, {4, false}, {6, true}}};

上面的声明“扩展”为

RelayArray<3, 10> myRelayArray...

现在,我想提供“D”,并且仅提供“D”。应再次从声明中推导出“N”。 以下作品:

RelayArray<3, 5> myRelayArray{{{2, true}, {4, false}, {6, true}}};

但不是这使用

5
作为第一个参数,而不是
D
:

RelayArray<5> myRelayArray{{{2, true}, {4, false}, {6, true}}}; // does not work

在 C++17 或更早版本中,有什么方法可以让

RelayArray<5>
选择
D=5
并让
N
从初始化器中推导出来?

例如,我找到了一些带有别名的解决方案,但我对此并不满意。

谢谢 弗雷德

c++ templates
1个回答
0
投票

因为默认模板参数必须是参数列表中的最后一个,所以实际上无能为力。别名或嵌套模板。别名模板

template <std::size_t N>
using RelayArray5 = RelayArray<N, 5>;

可用作嵌套类型:

template <std::uint8_t D = 10> 
struct Def {
       template <std::size_t N> using Array = RelayArray<N, D>;    
};

Def<5>::Array myRelayArray{{{2, true}, {4, false}, {6, true}}}; 
© www.soinside.com 2019 - 2024. All rights reserved.