c++ - 如何在类型上执行折叠表达式
问题描述
我尝试询问我的类型是否可以使用折叠表达式转换为任何类型的可变参数模板类型,但它不起作用。
我的尝试:
template<typename FromType, typename... ToType>
using enableIfPtrIsConvertible = std::enable_if_t<(false || std::is_convertible_v<FromType*, ToType*>...)>;
它不编译:
error C2059: syntax error: '...' error C2976: 'std::enable_if_t': too few template arguments
…</p>
谁能帮我?
我按照评论中的解释进行了尝试:
#include <type_traits>
template<typename FromType, typename... ToType>
using enableIfPtrIsConvertible = std::enable_if_t<(std::is_convertible_v<FromType*, ToType*> || ...)>;
class Base {};
class Derived :public Base {};
template <typename T, typename = enableIfPtrIsConvertible<T, Base, int>>
class Test {};
Test<Derived> tst1;
但我仍然得到这些编译器错误:
1>d:\vstest\odd\odd\isconvertible.h(3): error C2059: syntax error: '...' 1>d:\vstest\odd\odd\isconvertible.h(3): error C2976: 'std::enable_if_t': too few template arguments 1>c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.14.26428\include\xtr1common(59): note: see declaration of 'std::enable_if_t' 1>d:\vstest\odd\odd\isconvertible.h(11): error C2976: 'Test': too few template arguments 1>d:\vstest\odd\odd\isconvertible.h(9): note: see declaration of 'Test' 1>d:\vstest\odd\odd\isconvertible.h(11): error C2133: 'tst1': unknown size 1>d:\vstest\odd\odd\isconvertible.h(11): error C2641: cannot deduce template argument for 'Test'
这个有效
template<typename FromType, typename... ToTypes>
constexpr bool is_ptr_convertible_v = (std::is_convertible_v<FromType*, ToTypes*> || ...);
template<typename FromType, typename... ToTypes>
using enableIfPtrIsConvertible = std::enable_if_t<is_ptr_convertible_v<FromType, ToTypes...>>;
但我不明白为什么直接组合不能编译。
解决方案
template<typename FromType, typename... ToType>
using enableIfPtrIsConvertible = std::enable_if_t<false || (std::is_convertible_v<FromType*, ToType*> || ...)>;
你弄错了折叠语法。这个问题与类型无关。
或者:
template<typename FromType, typename... ToType>
using enableIfPtrIsConvertible = std::enable_if_t<(std::is_convertible_v<FromType*, ToType*> || ...)>;
这是相同的,但更清洁。
推荐阅读
- lua - 使用非整数键删除表
- jakarta-ee - 在 WSO2 迭代调解器上定义的这个 XPATH 表达式究竟是如何工作的?
- powershell - 检查远程机器的已安装程序不起作用
- android - 在调用阶段使用 Native C Sinch Client 的内存泄漏
- vb.net - 带有重定向到文件的 Shell 命令
- java - Spring Reactive - 重用 Mono 值
- python - 如何将多个函数打包到一个python包并上传到PyPI
- s4sdk - s4sdk - 无法连接到 NodeJS 微服务
- installation - 如何在二进制发行版中安装 Apache Ignite Web 控制台模块
- c# - Net Core:如何按端口分隔控制器?