Хочется сделать мета-функцию диспетчеризации для проверки наличия у класса специфического конструктора, типа 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.
Здравствуйте, 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;
Здравствуйте, Анатолий Широков, Вы писали:
АШ>АШ> std::cout << std::is_constructible<A, int&>::value << std::endl;
АШ> std::cout << std::is_constructible<B, int&>::value << std::endl;
АШ>
Действительно, как все просто оказалось. Как часто бывает, пропустил "слона"...