Информация об изменениях

Сообщение Проверка класса на конструктор c заданной сигнатурой от 23.08.2017 18:26

Изменено 23.08.2017 21:11 Videoman

Проверка класса на конструктор заданной сигнатурой
Хочется сделать мета-функцию диспетчеризации для проверки наличия у класса специфического конструктора, типа A(B& b).
template <typename ObjectType, typename Type>
inline auto has_x_constructor() -> decltype(Type(std::declval<ObjectType&>()), std::true_type()) 
{
    return std::true_type();
}

inline std::false_type has_x_constructor(...) 
{
    return std::false_type();
}

Использовать предполагается, примерно, так:
struct A
{
    A(int& a);
};

struct B
{
};
// ...
static_assert(has_x_constructor<int, A>(), "Success!");
static_assert(has_x_constructor<int, B>(), "Fail!");


Для VS2013 первая перегрузка никогда не разрешается (возможно код вообще не правильный, по стандарту). Обращаюсь к спецам по С++11, помочь и наставить на правильный путь. Интересует именно под VS2013.
Проверка класса на конструктор c заданной сигнатурой
Хочется сделать мета-функцию диспетчеризации для проверки наличия у класса специфического конструктора, типа A(B& b).
template <typename ObjectType, typename Type>
inline auto has_x_constructor() -> decltype(Type(std::declval<ObjectType&>()), std::true_type()) 
{
    return std::true_type();
}

inline std::false_type has_x_constructor(...) 
{
    return std::false_type();
}

Использовать предполагается, примерно, так:
struct A
{
    A(int& a);
};

struct B
{
};
// ...
static_assert(has_x_constructor<int, A>(), "Success!");
static_assert(has_x_constructor<int, B>(), "Fail!");


Для VS2013 первая перегрузка никогда не разрешается (возможно код вообще не правильный, по стандарту). Обращаюсь к спецам по С++11, помочь и наставить на правильный путь. Интересует именно под VS2013.