Можно ли явно указать параметры шаблона конструктора? - PullRequest
29 голосов
/ 19 мая 2010

Конструктор класса может быть функцией шаблона.В тот момент, когда вызывается такой конструктор, компилятор обычно просматривает аргументы, переданные конструктору, и определяет из них параметры используемого шаблона.Есть ли также некоторый синтаксис для явного указания параметров шаблона?

Придуманный пример:

struct A {
   template<typename T>
   A() {}
};

Есть ли способ создания экземпляра этого класса?Каков синтаксис для явного указания параметров шаблона конструктора?

Мой вариант использования был бы проблемой, если бы компилятор не находил правильный шаблонный конструктор.Явное указание параметров шаблона может привести к созданию более полезных сообщений об ошибках или даже к решению проблемы.

Ответы [ 4 ]

37 голосов
/ 19 мая 2010

Нет. Стандарт C ++ 03 гласит:

[Примечание: поскольку список явных аргументов шаблона следует за именем шаблона функции, и поскольку шаблоны функций-членов преобразования и шаблоны функций-членов конструктора вызываются без использования имени функции, невозможно предоставить явный список аргументов шаблона для этих шаблонов функций.] (§14.5.2 / 5)

8 голосов
/ 05 июня 2013

Существует другое решение для передачи информации о типе шаблонным конструкторам, которые не могут принимать значение этого типа в качестве аргумента:

template<class T>
struct id
{};

struct A {
  template<class T>
  A(id<T>);
};

A a=id<int>();

Edit:

Обратите внимание: A a(id<int>()); не будет работать из-за самого неприятного разбора. Это будет интерпретировано как объявление функции. См. этот вопрос для дальнейшего объяснения.

3 голосов
/ 19 мая 2010

нет, вы не можете создать экземпляр этого класса с помощью этого конструктора. НО:



struct A
{
  template < typename T >
  A(T const&);
};

Теперь вы можете.

2 голосов
/ 30 декабря 2018

В качестве обходного пути: вы можете определить шаблонную статическую фабричную функцию, которая, в свою очередь, будет возвращать экземпляр, используя закрытый конструктор.

struct A {
    template<typename T>
    static A create() {
        return A();
    }
private:
    A() {}
};

Затем вы получаете новые экземпляры A, такие как:

auto a1 = A::create<int>();
auto a2 = A::create<long>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...