我有一个模板化函数如下:
template<typename T>
std::vector<RT> myFunc(std::vector<T> inVec){
...
std::vector<RT> outVec;
return outVec
我需要返回类型 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++ 代码吗?
最佳答案
Is this not legal C++ code?
是的,这不是有效的语法。
您可以使用 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;
}
关于c++ - 基于其他模板参数类型的默认模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56496526/