Статический Утверждение, что тип A может быть построен из типа B

Я пытаюсь сделать статическое утверждение, чтобы проверить это для двух типов A и B; класс A должен иметь открытый конструктор подписи A (B& б) или А (const B& б).

Я хотел бы иметь что-то вроде is_constructable_from<A, B>::value который оценивает true если существует публичный A (B& б) или А (const B& б) или А (В б).

Я думаю, это несколько отличается от повышения is_convertible type_trait.

Как мне этого добиться?

Я что-то упустил, что будет делать это в Boost Type Traits или в библиотеке Concept Check?

Прямо сейчас мне нужно сделать статическую проверку, что выражение A a(b) является допустимым, что, как предполагает Sehe, является менее ограничительным, чем предыдущая концепция. Решение для обоих случаев приветствуется. Мне разрешено использовать Boost.

3

Решение

Конструкторы не являются функциями-членами — у них нет адреса, который вы можете взять, поэтому с SFINAE невозможно напрямую проверить их наличие.*.

Хотя это не так именно так то, что вы просили, с C ++ 11 вы можете приблизиться с станд :: is_constructible,
и с C ++ 03 вы должны развернуть свой собственный:

template<class A, class B = void>
struct is_constructible;

template<class A, class B>
struct is_constructible {

template<class U> static U declval();
template<std::size_t N> struct dummy;
template<class U> static char test(dummy<sizeof(U(declval<B>()))>*);
template<class U> static long test(...);

static const bool value = sizeof(test<A>(0)) == sizeof(char);
};


* Следующее является интересной попыткой, но, насколько я понимаю, она не работает на разных компиляторах:
Проверьте во время компиляции подпись конструктора класса

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector