Я пытаюсь сделать статическое утверждение, чтобы проверить это для двух типов 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.
Конструкторы не являются функциями-членами — у них нет адреса, который вы можете взять, поэтому с 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);
};
* Следующее является интересной попыткой, но, насколько я понимаю, она не работает на разных компиляторах:
Проверьте во время компиляции подпись конструктора класса