c++ - 基于其他模板参数类型的默认模板参数
问题描述
我有一个模板函数如下:
template<typename T>
std::vector<RT> myFunc(std::vector<T> inVec){
...
std::vector<RT> outVec;
return outVec
我需要使用 if is then将与但如果不是 then将是相同的逻辑RT
来推断返回类型。T
T
std::complex
RT
T
RT
std::complex<T>
我尝试定义一个类型特征来检查是否T
是std::complex
并且有一个基于它的默认模板参数,如下所示:
template<typename T>
struct is_complex : std::false_type {};
template<typename T>
struct is_complex<std::complex<T>> : std::true_type {};
template<typename T, typename RT = typename is_complex<T>::value ? T : std::complex<T>>
std::vector<RT> myFunc(std::vector<T> inVec){
...
std::vector<RT> outVec;
return outVec
但这不会编译给我以下错误:
error: expected '>' before '?' token template<typename T, typename RT = typename is_complex<T>::value ? T : std::complex<T>>
这不是合法的 C++ 代码吗?
解决方案
这不是合法的 C++ 代码吗?
是的,它不是有效的语法。
您可以使用std::conditional
.
template<typename T, typename RT = std::conditional_t<is_complex<T>::value, T, std::complex<T>>>
std::vector<RT> myFunc(std::vector<T> inVec){
std::vector<RT> outVec;
return outVec;
}
或者您可以直接定义返回类型特征。
template <typename T>
struct rt {
using type = std::complex<T>;
};
template <typename T>
struct rt<std::complex<T>> {
using type = std::complex<T>;
};
template <typename T>
using rt_t = typename rt<T>::type;
template<typename T, typename RT = rt_t<T>>
std::vector<RT> myFunc(std::vector<T> inVec){
std::vector<RT> outVec;
return outVec;
}
推荐阅读
- sql - 查找表 Y 中与表 X 中的时间最接近的时间
- php - Wordpress 置顶帖复选框未保存
- php - 比较 JSON API 中未以数字格式列出的数据
- mysql - 如果多个字段为 0,则删除 MySQL 表行,使用触发器
- python - 如何停止python打印多行?
- php - 从 MySQL 中的 BLOB 读取 pdf 内容
- html - 引导程序 4 中未显示自定义文件输入标签
- wxpython - 文件类型通配符多个句点 OSX
- typescript - 有没有办法描述 TypeScript 中两个参数之间的关系?
- service-worker - service-worker.js 中未捕获的 promise DOM 异常