C 模板可以匹配(仅)一种类型的列表或另一种类型的列表
Can a C++ template match (only) a list of one type, or a single other type?
我想编写模板以构造输入端口。可以从单个输入输出端口或输入引脚列表中完成。我更喜欢这些模板具有相同的名称。我对输入输出端口和输入引脚都有概念。我可以写
template< typename... arguments >
struct port_in ....
template< pin_in T >
struct port_in<> ....
但是现在列表版本将接受任何类型。我可以在实现中检查一下,但是当用户传递不适合的类型时,这会降低错误消息。我可以以某种方式将列表限制为一种类型,但允许另一种类型的单个模板参数?
如果要确保用户始终收到合理的错误消息,则需要约束基本模板。假设您的现有概念命名为InputPin
和InputOutputPort
,则可以约束基本模板以接受输入引脚序列或单个输入/输出端口,如下所示:
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 {
// ...
};
如果列表版本应该采用数字,则可以这样做:
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> ....
相关文章:
- 使用简单类型列表实现的指数编译时间.为什么
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 测试两个类型列表中的所有组合
- 谷歌测试:模板模板的笛卡尔乘积的类型列表与模板
- 在迭代模板类型列表时无法停止递归
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- 阅读从 istream 到矢量的不同类型列表
- 如何在C++中创建类型列表的 n 路笛卡尔积?
- c++17通过生成预先声明的类型列表的笛卡尔乘积来生成std::变体
- 将变量模板限制为类型列表
- 我可以使用特征指定变体的类型列表吗?
- 如何对要用于模板参数的类型列表进行编码
- 创建类型列表并访问每种类型的静态成员?
- 为什么BOOST :: HANA :: EXAREMIS ::键入实验功能?类型列表的棘手是什么
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- std::仅移动类型列表:不能在 VC++ 中放入 std::vector
- C++类型列表创建子列表
- 调用STD ::功能,并带有变体类型列表
- 在没有宏的情况下在 C++98 中创建类型列表时遇到问题
- 如何从类型列表重建参数包