.
-, , (T1 T2). , - :
template<typename... Args>
struct are_convertible;
-, - , () , . :
template <typename T1, typename T2, typename... Args>
struct are_convertible<T1, T2, Args...> {
:
class A {};
class B : public A {};
class C {};
class D : public C {};
template<typename... Args>
struct are_convertible;
template <>
struct are_convertible<> {
static const bool value = true;
};
template <typename T1, typename T2, typename... Args>
struct are_convertible<T1, T2, Args...> {
static const bool value = std::is_convertible<T1, T2>::value && are_convertible<Args...>::value;
};
int main() {
std::cout << std::boolalpha;
std::cout << "Are convertible A->B and C->D: " << are_convertible<A, B, C, D>::value << std::endl;
std::cout << "Are convertible B->A and D->C: " << are_convertible<B, A, D, C>::value << std::endl;
}
false true, .