c++ - C++ 模板是否可以(仅)匹配一种类型或一种其他类型的列表?

标签 c++ templates variadic-templates c++-concepts

我想编写模板来构建比方说输入端口。这可以通过单个输入输出端口或输入引脚列表来完成。我更喜欢那些模板具有相同的名称。我对输入输出端口和输入引脚都有概念。我会写

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

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

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

最佳答案

如果你想确保用户总是得到合理的错误信息,那么你需要约束基本模板。假设您现有的概念被命名为 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 {
  // ...
};

关于c++ - C++ 模板是否可以(仅)匹配一种类型或一种其他类型的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47840064/

相关文章:

c++ - 如何像 std::function 一样改变模板实例化的外观

c++ - 参数包和移动语义

javascript - 如何从标记函数中调用原生 es6 模板字符串替换?

c++ - 创建一个包含不同驱动类元素的元组,其构造函数接收一个 int 类型,由其在元组中的索引确定

android - JNI 调用将 jstring 转换为 char*

c++ - Arduino-PROGMEM avr/pgmspace.h出现问题

c++ - 根据作用域或非作用域枚举的隐式实例化

C++函数装饰器

c++ - 将 nullptr 参数委托(delegate)给模板代码中的指针重载

c++ - 构造时保留子 vector