【问题标题】:Default template parameter based on type of other template parameter基于其他模板参数类型的默认模板参数
【发布时间】:2019-06-07 14:44:49
【问题描述】:

我有一个模板函数如下:

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

我需要从T 推导出返回类型RT,如果Tstd::complex,那么RT 将与T 相同,但如果不是,则RT 将是std::complex&lt;T&gt;

我尝试定义一个类型特征来检查 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++ templates template-meta-programming


【解决方案1】:

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

【讨论】:

  • 太棒了,感谢您的快速回复和替代解决方案。
猜你喜欢
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2018-07-04
  • 1970-01-01
  • 2021-05-23
  • 2015-08-15
  • 2020-01-09
相关资源
最近更新 更多