Мне нужна черта типа, чтобы проверить, являются ли все типы в пакете параметров конструктивными. Это то, что я сделал до сих пор. Основная функция содержит некоторые тестовые примеры, чтобы проверить функциональность.
#include <type_traits>
#include <string>
#include <memory>
template <class... Args0toN>
struct areCopyConstructible;
template<>
struct areCopyConstructible<> : std::true_type {};
template <class Arg0, class... Args1toN, class std::enable_if< !std::is_copy_constructible<Arg0>::value>::type* = nullptr >
struct areCopyConstructible : std::false_type {};
template <class Arg0, class... Args1toN, class std::enable_if< std::is_copy_constructible<Arg0>::value>::type* = nullptr >
struct areCopyConstructible : areCopyConstructible<Args1toN...> {};
int main()
{
static_assert(areCopyConstructible<>::value, "failed");
static_assert(areCopyConstructible<int>::value, "failed");
static_assert(areCopyConstructible<int, std::string>::value, "failed");
static_assert(!areCopyConstructible<std::unique_ptr<int> >::value, "failed");
static_assert(!areCopyConstructible<int, std::unique_ptr<int> >::value, "failed");
static_assert(!areCopyConstructible<std::unique_ptr<int>, int >::value, "failed");
}
Моя идея состояла в том, чтобы проверить рекурсивно, является ли элемент главы пакета конструктивным или нет и дальше, с хвостом. К сожалению, у меня нет этой идеи для компиляции. Мои знания о вариативных шаблонах не очень продвинуты. Я думаю, что enable-if после пакета параметров в списке шаблонов не работает. Понятия не имею. Кто-нибудь имеет хороший совет, как решить проблему?