C ++模板可以(仅)匹配一种类型的列表,还是一种其他类型的列表?

问题描述 投票:5回答:2

我想写模板来构造让我们说一个输入端口。这可以从单个输入输出端口或输入引脚列表中完成。我更喜欢这些模板具有相同的名称。我有输入输出端口和输入引脚的概念。我可以写

template< typename... arguments > 
struct port_in ....

template< pin_in T > 
struct port_in<> ....

但现在列表版本将接受任何类型。我可以在实现中检查它,但这会降低用户在传递不适合的类型时获得的错误消息。我可以以某种方式将列表限制为一种类型,但允许另一种类型的单个模板参数吗?

c++ templates variadic-templates c++-concepts
2个回答
4
投票

如果要确保用户始终获得合理的错误消息,则需要约束基本模板。假设您现有的概念名为InputPinInputOutputPort,您可以将基本模板约束为接受一系列输入引脚或单个输入/输出端口,如下所示:

template<class... Ts>
concept bool AllInputPins = (InputPin<Ts> && ...);

template<class... Ts>
concept bool OneInputOutputPort = sizeof...(Ts) == 1 && (InputOutputPort<Ts> && ...);

template <class... Args>
  requires AllInputPins<Args...> || OneInputOutputPort<Args...>
struct port_in {
  // ...
};

1
投票

如果列表版本应该采用数字,你可以做到:

template<uint16_t ... Ports>
struct port_in ....

如果它可以采用非整数并且你想要一个实际的类型列表(并不是所有的参数都需要是相同的类型),我不确定是否有一种干净的方法可以做到这一点。如果您可以要求所有类型都相同,我认为您可以执行以下操作:

template<typename T, std::enable_if_t<T> * = nullptr>
struct port_in_base{};
template<typename T, T ... ports>
struct port_in : port_in_base<T> ....
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.