Введение
Я ищу шаблон, чтобы преобразовать черты типа С++ в свои переменные . Методология для решения этой проблемы была бы оценена, и генеративное программирование шаблонов для автоматизации задачи было бы идеально.
Пример
Возьмите следующее:
std::is_same<T, U>::value;
Я хочу написать черту, которая работает так:
std::are_same<T1, T2, T3, T4>::value;
Текущий подход
Это довольно прямое для реализации are_same
; Ищем общее решение, мы можем придумать инструмент для любого вариационного признака, реализующего универсальное квантификацию:
template<template<class,class> class F, typename...Ts>
struct Univ;
template<template<class, class> class F, typename T, typename U, typename...Ts>
struct Univ<F, T, U, Ts...>
{
static const int value = F<T, U>::value && Univ<F, U, Ts...>::value;
};
template<template<class, class> class F, typename T>
struct Univ<F, T>
{
static const int value = 1;
};
чтобы, например, are_same
мог писать как
Univ<is_same,int, int, int>::value
и это может применяться при создании таких черт, как are_classes
, are_scalars
и т.д.
Обобщая
Незначительные твики могут дать экзистенциальную квантификацию из предыдущего фрагмента (заменив &&
на ||
), чтобы мы создали такие черты, как exist_same
следующим образом:
Exist<is_same, int, double, float>::value
Вопрос
Предыдущее обобщение обложек типа , относящееся к
- Категории первичного типа
- Категории композитного типа
- Свойства типа
- Поддерживаемые операции
Как бы я обобщил для типов типов, как показано ниже:
enable_if -> enable_if_any // enable if any clause is true
enable_if_all // enalbe if all clauses are true
enable_for // enable only for the type provided
Приведенный выше пример exist_same
упрощен. Любые идеи для правильной реализации?
Существуют типы type_traits, которые возвращают модифицированные типы. Любое предложение по масштабированию для реализаций для произвольного числа типов?
Существуют ли type_traits, которые не масштабируются до произвольного количества аргументов типа?