c ++ вызывает специфический конструктор шаблона класса шаблона - PullRequest
5 голосов
/ 15 июня 2011

Можно ли вызвать конструктор с аргументами шаблона, если класс тоже является шаблоном?

#include <stdio.h>
#include <iostream>

template <class A>
struct Class
{
  template <class B>
  Class(B arg) { std::cout << arg << std::endl; }
};

int main()
{
  Class<int> c<float>(1.0f);
  Class<int>* ptr = new Class<int><float>(2.0f);
  return 0;
}

edit: так что я думаю, что единственный способ вызвать конкретный конструктор шаблона - это вызвать его с приведенными параметрами для нужного типа шаблона:

#include <stdio.h>
#include <iostream>

template <class A>
struct Class
{
  template <class B>
  Class(B arg) { std::cout << arg << std::endl; }

  Class(double arg) { std::cout << "double" << std::endl; }
  Class(float arg) { std::cout << "float" << std::endl; }
};

int main()
{
  Class<int> c(1.0f);
  Class<int>* ptr = new Class<int>((double)2.0f);
  return 0;
}

// это выводит: поплавок двойной

edit2: но что происходит с аргументами шаблона конструктора, которые не являются частью самого аргумента конструктора?

template <class B, class C>
Class(B arg) { /* how do you specify ?? C */ }

Ответы [ 4 ]

4 голосов
/ 15 июня 2011

В приведенном вами примере не нужно явно указывать аргумент template для вызова конструктора, например:

Class<int> c<float>(1.0f);

Просто указать аргумент как 1.0fдостаточно:

Class<int> c(1.0f);

То же самое применимо и к примеру new.Сказав это, я не думаю, что конструктор вы можете вызвать явно, используя аргумент template (в отличие от обычной функции).

2 голосов
/ 17 июня 2011

edit2: но что происходит с аргументами шаблона конструктора, которые не являются частью аргументов самого конструктора?

Затем вы можете передать аргумент, закодированный в нем

template<typename T> struct encodeType { };

struct A {
  template<typename T, typename U>
  A(T t, encodeType<U>) { }
};

A a(1, encodeType<float>());
1 голос
/ 15 июня 2011

Вам нужно явно указать тип шаблона, который соответствует самому классу (это A в вашем примере).Но вам не нужно говорить, что типа B.Компилятор знает от вас прохождение 1.0f, что B == float.В вызове конструктора нет ничего, что помогло бы компилятору выяснить, что такое A, поэтому вы должны сказать это:

Class<int> c(1.0f);
Class<int>* ptr = new Class<int>(2.0f);
1 голос
/ 15 июня 2011
Class<int> c(1.0f); //f in 1.0 makes it float type!
Class<int>* ptr = new Class<int>(2.0f);

Этого достаточно. Он вызовет конструктор с аргументом шаблона float. Из аргумента 1.0f компилятор выведет аргумент типа шаблона конструктора. Поскольку 1.0f равно float, то аргумент типа, который будет выводить компилятор: float.

Точно так же: 1009 *

Class<int> c(1.0); //this will invoke Class<int><double>(double);
Class<int>* ptr = new Class<int>(2); //this will invoke Class<int><int>(int);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...