Кто-нибудь знает, как обнаружить конструктор с одним аргументом? Например, эта структура должна иметь отрицательный результат:
struct MyStruct
{
MyStruct( int x, int x2 ) : y( x ) {}
int y;
};
У меня есть хорошая проверка SFINAE, чтобы увидеть, является ли класс или структура конструктором с определенным количеством аргументов. Вот тот, для количества аргументов 3:
template <typename T>
struct HasCtor3Args
{
struct Any { template <typename U> operator U( void ); };
template <typename U>
static int32 SFINAE( decltype( U( Any( ), Any( ), Any( ) ) ) * );
template <typename U>
static int8 SFINAE( ... );
static const bool value = sizeof( SFINAE<T>( NULL ) ) == sizeof( int32 );
};
Кажется, это работает просто отлично, так как структура Any
может преобразовываться в любые типы, которыми должны быть параметры. Однако проблема заключается в попытке обнаружить конструктор только с одним аргументом. Проверка SFINAE, кажется, всегда возвращает true из-за того, что по умолчанию Any
имеет тот же тип, что и T
, таким образом обнаруживая конструктор копирования.
Изменить и обновить. Я предпринял несколько попыток, но ни одна из них не увенчалась успехом... Это был самый близкий вариант, который я мог получить, но он не работает, поскольку всегда возвращает значение true. Идея заключалась в том, чтобы попытаться разрешить конструктор копирования вместо первого вызова «поймать все»:
template <typename T>
struct HasCtor1Args
{
struct Any
{
template <typename U>
operator U( ) const;
};
template <typename U>
static int32 SFINAE( decltype( U( Any( ) ) ) * );
// Try to catch the copy ctor here
T MakeT( void );
template <typename U>
static int8 SFINAE( decltype( U( MakeT( ) ) ) * );
template <typename U>
static int8 SFINAE( ... );
static const bool value = sizeof( SFINAE<T>( NULL ) ) == sizeof( int32 );
};
Я также пытался использовать явное ключевое слово вместе с функцией = delete для С++ 11, а затем понял, что компилятор, который мне нужно использовать (Microsoft), не позволяет этого. Я также пытался использовать std::enable_if для типа преобразования U, хотя столкнулся с ошибкой, что параметры шаблона функции не могут быть установлены по умолчанию.
std::is_constructible
- person dyp   schedule 22.04.2013template < typename U > explicit operator U() const;
. Мне пришлось искать это в стандарте, но это может быть ошибка в g++ 4.8. - person dyp   schedule 22.04.2013Any
в тип параметраT
, например.struct my_type{ my_type(int,int,int); my_type(int,int,bool); };
- person dyp   schedule 22.04.2013