Вывод типа параметра шаблона c ++

У меня такой шаблон в C ++

template struct Ptr {}; 

поэтому я могу использовать его как таковой:

 const int i = 0; Ptr ptr; 

или

 Ptr ptr; 

Но я не хочу дважды указывать тип int или идентификатор i , я хочу использовать только

 Ptr ptr; 

и пусть компилятор сам определяет часть типа int .

Как я могу объявить свой шаблон для этого?

Я прочитал этот вопрос, но ответ использует macros, это не приятно: шаблон шаблона c ++?

могу ли я сделать это с помощью простого шаблона без макросов? Я использую Visual C ++ 2013.

Поскольку вы запрашиваете решение на основе шаблонов на основе чистого 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; 
  • Использование SFINAE для проверки глобального оператора <<?
  • Возrotation пустоты?
  • Как реализовать сайт с сотнями страниц в Angular2
  • std :: enable_if: параметр vs template
  • Проблема GCC: использование члена базового classа, который зависит от аргумента шаблона
  • Как инициализировать std :: array элегантно, если T не является конструктивным по умолчанию?
  • В чем различия между «родовыми» типами в C ++ и Java?
  • Почему я не могу использовать значение float в качестве параметра шаблона?
  • Каковы различия между Generics в C # и Java ... и шаблонами в C ++?
  • Синглтоны: хороший дизайн или костыль?
  • Можно ли создавать стандартные шаблоны контейнеров с неполными типами?
  • Interesting Posts

    Нет ConcurrentList в .Net 4.0?

    Ошибка установки Visual Studio 2015 Enterprise Update 1 с Team Explorer

    Настройка CNTLM для прокси-сервера, требующего базовой аутентификации

    Как приостановить android.speech.tts.TextToSpeech?

    Ошибка «Приложение не установлено» на Android

    Наиболее эффективный способ случайного выбора набора различных целых чисел

    Лямбда эта ссылка в java

    Поверхность статических и динамических столбцов в datatable

    MongoDB: уникальный индекс для свойства элемента массива

    Как получить максимальное разрешение на Ubuntu в Microsoft Virtual PC?

    Использование переменной iteratorа цикла foreach в выражении lambda – почему не удается?

    Android продолжает кэшировать мои намерения. Дополнительно, как объявить ожидающее намерение, которое содержит свежие дополнения?

    Как запустить веб-сервер Apache Tomcat на моем ПК и получить доступ к нему с реального устройства Android?

    Вызывается ли сборщик мусора Dispose ()?

    Как найти все перестановки данного слова в заданном тексте?

    Давайте будем гением компьютера.