Любой способ исправить этот тип удержания? - PullRequest
0 голосов
/ 11 января 2019

Тип удержания не выполняется в следующем случае. Он компилируется, если я указываю аргумент шаблона для someFunc. Я определенно вижу, как это странно, но было бы неплохо, если бы я мог заставить его работать. Есть ли альтернативный способ сформулировать его, который будет компилироваться без предоставления параметра шаблона? Решение C ++ 17 отлично.

#include <type_traits>

template<typename T>
using choose_arg_type = typename std::conditional<std::is_fundamental<T>::value,T,const T &>::type;

template<typename T>
T someFunc(choose_arg_type<T> arg)
{
    return arg + arg;
}

int main()
{
    auto result = someFunc(0.0);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Нет, choose_arg_type<T> находится в не выводимом контексте. Дубликатов уже довольно много.

Однако у вас может быть две перегрузки, и SFINAE-разрешить их в зависимости от типа.

0 голосов
/ 11 января 2019

В

template<typename T>
T someFunc(choose_arg_type<T> arg)

T является зависимым типом. Из-за этого здесь не произойдет никакого вывода типа. Вы можете обойти эту проблему, используя SFINAE и представляя набор перегрузок, когда тип является основным или нет. Это будет выглядеть как

template<typename T, std::enable_if_t<std::is_fundamental_v<T>, bool> = true>
T someFunc(T arg)
{
    return arg + arg;
}

template<typename T, std::enable_if_t<!std::is_fundamental_v<T>, bool> = true>
T someFunc(const T& arg)
{
    return arg + arg;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...