我有一个这样的类模板:
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
从初始化器中推导出来?
例如,我找到了一些带有别名的解决方案,但我对此并不满意。
谢谢 弗雷德
因为默认模板参数必须是参数列表中的最后一个,所以实际上无能为力。别名或嵌套模板。别名模板
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}}};