Проверка класса на конструктор c заданной сигнатурой
От: Videoman Россия https://hts.tv/
Дата: 23.08.17 18:26
Оценка:
Хочется сделать мета-функцию диспетчеризации для проверки наличия у класса специфического конструктора, типа 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.
Отредактировано 23.08.2017 21:11 Videoman . Предыдущая версия . Еще …
Отредактировано 23.08.2017 19:30 Videoman . Предыдущая версия .
Re: Проверка класса на конструктор c заданной сигнатурой
От: Анатолий Широков СССР  
Дата: 24.08.17 05:25
Оценка: 11 (3)
Здравствуйте, Videoman, Вы писали:

V>Хочется сделать мета-функцию диспетчеризации для проверки наличия у класса специфического конструктора, типа A(B& b).


см. http://en.cppreference.com/w/cpp/types/is_constructible

  std::cout << std::is_constructible<A, int&>::value << std::endl;
  std::cout << std::is_constructible<B, int&>::value << std::endl;
Re[2]: Проверка класса на конструктор c заданной сигнатурой
От: Videoman Россия https://hts.tv/
Дата: 24.08.17 11:59
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>
АШ>  std::cout << std::is_constructible<A, int&>::value << std::endl;
АШ>  std::cout << std::is_constructible<B, int&>::value << std::endl;
АШ>


Действительно, как все просто оказалось. Как часто бывает, пропустил "слона"...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.