c++ - 基于其他模板参数类型的默认模板参数

标签 c++ templates template-meta-programming

我有一个模板化函数如下:

template<typename T>
std::vector<RT> myFunc(std::vector<T> inVec){
    ...
    std::vector<RT> outVec;
    return outVec

我需要返回类型 RTT推导出来逻辑如果 Tstd::complex然后RT将与 T 相同但如果不是那么RT将是 std::complex<T> .

我尝试定义一个类型特征来检查是否 Tstd::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/

相关文章:

c++ - 如何强制新运算符(operator)根据我的需要解释语句

c++ - 更多类的模板化律师-客户习语

c++ - 在编译时防止 header 包含在某些文件中?

C++根据其模板定义一个类成员类型

c++ - 反平方根内在函数

c++ - 在非常量函数中使用 const_iterator

AngularJS - 如何制作具有多个部分的 SPA

c++ - 模板元编程,cv-qualification 错误中的冲突

c++ - 多维数组初始化: Any benefit from Threading?

使用模板的C++静态编译错误