Почему этот шаблон определяет набор псевдонимов, соответствующих void? - PullRequest
2 голосов
/ 29 июня 2019

Я обертываю функцию get варианта с шаблонной функцией, возвращающей тип, определенный в структуре алиасированных типов. Я должен быть в состоянии ввести псевдоним типа в шаблон и заставить функцию возвращать значение этого типа, но вместо этого тип не соответствует и возвращает «void». Почему это так?

#include <iostream>
#include <type_traits>
#include <utility>
#include <string>
#include <variant>

using namespace std;

struct Type
{
    using String = std::string;
    using Int = int;
};

template<typename T>
using TType = enable_if_t<
    is_same<T, Type::String>::value ||
    is_same<T, Type::Int>::value
>;

template<typename T> TType<T> getValue(variant<Type::String, Type::Int> const& value)
{
    return get<T>(value);
}

int main()
{
    variant<Type::String, Type::Int> value = "";
    cout << getValue<Type::String>(value) << endl;
}

1 Ответ

5 голосов
/ 29 июня 2019

enable_if_t принимает два параметра.Второй тип, который будет включен, и по умолчанию void.Измените свою декларацию TType на

template<typename T>
using TType = enable_if_t<
    is_same<T, Type::String>::value ||
    is_same<T, Type::Int>::value,
    T
>;

(добавив , T после вашего условия).

...