首页 > 解决方案 > 基于其他模板参数类型的默认模板参数

问题描述

我有一个模板函数如下:

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

我需要使用 if is then将与但如果不是 then将是相同的逻辑RT来推断返回类型。TTstd::complexRTTRTstd::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++ 代码吗?

标签: c++templatestemplate-meta-programming

解决方案


这不是合法的 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;
}

推荐阅读