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

时间:2019-06-07 14:44:49

标签: c++ templates template-meta-programming

我具有如下模板功能:

public int[] twoSum(int[] nums, int target) {
  for (int i = 0; i < nums.length; ++i) 
    for (int j = i + 1; j < nums.length; ++j) 
      if (nums[i] + nums[j] == target) 
        return new int[] {i, j};   // we've found it! Let's return it 

  return new int[0]; // let's return an empty array, not {0, 0} one  
}

我需要根据逻辑从template<typename T> std::vector<RT> myFunc(std::vector<T> inVec){ ... std::vector<RT> outVec; return outVec 推导返回类型RT,如果TT,则std::complex将与{{ 1}},但如果不是,则RT将是T

我尝试定义类型特征以检查RT是否为std::complex<T>并基于此设置默认模板参数,如下所示:

T

但这无法编译,但出现以下错误:

std::complex

这不是合法的C ++代码吗?

1 个答案:

答案 0 :(得分:2)

  

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