Вывод типа параметра шаблона c ++
У меня такой шаблон в C ++
template struct Ptr {};
поэтому я могу использовать его как таковой:
const int i = 0; Ptr ptr;
или
- Код рефакторинга, чтобы избежать
- Как перенаправить объявление classа шаблона в пространстве имен std?
- initializer_list и вывод типа шаблона
- Идентификация примитивных типов в шаблонах
- C ++ Template Metaprogramming - Можно ли выводить сгенерированный код?
Ptr ptr;
Но я не хочу дважды указывать тип int
или идентификатор i
, я хочу использовать только
Ptr ptr;
и пусть компилятор сам определяет часть типа int
.
Как я могу объявить свой шаблон для этого?
Я прочитал этот вопрос, но ответ использует macros, это не приятно: шаблон шаблона c ++?
могу ли я сделать это с помощью простого шаблона без макросов? Я использую Visual C ++ 2013.
- C ++ 11 не выводит тип, когда задействованы функции std :: function или lambda
- Параметры шаблона шаблона
- объявление друга объявляет функцию без шаблона
- C ++ шаблон typedef
- Можете ли вы создавать пользовательские операторы на C ++?
- Шаблоны C ++ Угловые скобки Pitfall - Что такое C ++ 11?
- Препроцессор C ++: избегать повторения кода списка переменных-членов
- Сведения о создании шаблона компиляторов GCC и MS
Поскольку вы запрашиваете решение на основе шаблонов на основе чистого classа без помощи макроопределений, тогда ответ прост: на данный момент (декабрь 2014 г., C ++ 14) это невозможно .
Эта проблема уже была определена Комитетом по стандартизации WG21 C ++ как необходимость, и есть несколько предложений, позволяющих шаблонам автоматически выводить тип аргументов шаблона непигового типа.
Ближайшим является N3601 Неявные параметры шаблона :
Неявные параметры шаблона
objective этого примера – устранить необходимость в избыточном
template
idiom. Эта идиома широко используется, и более 100 тыс. Хитов в Google.objective состоит в том, чтобы иметь возможность заменить объявление
template
подобноstruct C; template
с другим объявлением, чтобы мы могли создать шаблон, подобныйstruct C; C<&X::f>
вместо того, чтобы говоритьC
.Основная идея состоит в том, чтобы иметь возможность сказать
template
чтобы указать, чтоstruct C {/* ... */}; T
следует вывести. Для более подробного описания мы рассмотрим некоторые расширенные примеры шаблонных classов и функций.[…]
Основная идея заключается в том, что передача типа второго параметра шаблона является избыточной информацией, поскольку она может быть выведена с использованием вычитания обычного типа из второго параметра типа. Имея это в виду, мы предлагаем, чтобы предварительный параметр шаблона с использованием указывал на то, что он не должен передаваться явно как аргумент шаблона, а вместо этого будет выводиться из последующих аргументов шаблона непигового типа. Это сразу позволяет нам улучшить удобство
describe_field
description_field следующим образом.template
struct describe_field { /* ... */ }; /* ... */ cout << describe_field<&A::f>::name; // OK. T is void(A::*)(int) cout << describe_field<&A::g>::arity; // OK. T is double(A::*)(size_t)
Аналогичным предложением является тот, который включен в N3405 Template Tidbits :
T для двух
Мотивационный пример – это свойство предполагаемого типа отражения, дающее свойства члена classа.
struct A { void f(int i); double g(size_t s); }; /* ... */ cout << describe<&A::f>::name; // Prints "f" cout << describe<&A::g>::arity; // prints 1
Вопрос в том, «как должно выглядеть заявление описания?» Поскольку он принимает параметр шаблона непигового типа, нам нужно указать тип параметра, используя знакомый (100 тыс. Хитов в Google)
“template
idiom” template
struct describe; […]
Наша ключевая идея заключается в том, что передача типа второго параметра шаблона (почти всегда) избыточной информации, поскольку его можно вывести с использованием вычитания обычного типа из второго параметра типа. Имея это в виду, мы предлагаем разрешить
describe
объявления следующим образом.template
struct describe; /* ... */ cout << describe<&A::f>::name; // OK. T is void(A::*)(int) cout << describe<&A::g>::arity; // OK. T is double(A::*)(size_t)
Нынешний статус обоих предложений можно отследить по вопросу 9 EWG .
Есть и другие обсуждения, предлагающие альтернативный синтаксис с auto
:
template struct describe;