Параметр шаблона по умолчанию на основе типа другого параметра шаблона - PullRequest
3 голосов
/ 07 июня 2019

У меня есть шаблонная функция, как показано ниже:

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 ++?

1 Ответ

2 голосов
/ 07 июня 2019

Разве это не допустимый код 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;
}
...