Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шаблонный конструктор 
V
    Опции темы
Ivan.
  Дата 13.8.2015, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Здравствуйте.
Помогите решить задачу, если класс с шаблонным методом:
Код
struct First {
    template<typename T>
    void func(){}
};
First first;
Данный метод можно уточнить при вызове
Код
first.func<int>();
а как уточнить шаблонный конструктор?
Код
struct Second {
    template<typename T>
    Second(){}
};
Second second<int>(); //Error 1 expected initializer before '<' token
Можно конечно передать его в качестве аргумента:
Код

struct Third {
    template<typename T>
    Third(const T&&){}
};
Third third(int());
 но это не удобно, т.к. нельзя установить значение по умолчанию
Код
struct Second {
    template<typename T = int>
    Second(){}
};
Second second();



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
tzirechnoy
Дата 14.8.2015, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
т.к. нельзя установить значение по умолчанию


Сделай один отдельный конструктор по умолчанию.

Код

        template<typename T> Second(T a){
                T t1 = 0;
                cout << t1 << "," << sizeof(t1) << "\n";
        };
        Second() : Second((int)0) {};

...
Код

        Second second, third((double)0);




PM MAIL   Вверх
Ivan.
Дата 14.8.2015, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



я пока так и сделал, но что если конструктор сложный, или их и так уже 5 штук, перегрузив их будет уже 10.
может можно как то раскрыть конструктор, например оператор == можно раскрыть как:
Код
    template<typename T>
    bool operator == (const T& t){return sizeof(T) == 1;}
    first.operator==<long>(1);
Код
Second second.constructor<int>(); //что-то вроде этого
Second second::Second<int>(); //или этого


Это сообщение отредактировал(а) Ivan. - 14.8.2015, 20:57


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
tzirechnoy
Дата 15.8.2015, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
но что если конструктор сложный,


Синтаксис дефолтного это сильно не изменит.

Цитата
их и так уже 5 штук, перегрузив их будет уже 10.


Дефолтный конструктор всегда один.

В общем, по-моему нельзя, но вариант с передачей какого-то вида значения, связанного с этим типом, по-моему решает всё.
PM MAIL   Вверх
disputant
Дата 15.8.2015, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Откровенно говоря, вызывает сомнения сам дизайн...

Какой смысл в инициализации класса только типом? Может, тогда имеет смысл сделать шаблонным сам класс?
PM MAIL   Вверх
Ivan.
Дата 15.8.2015, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Цитата
Дефолтный конструктор всегда один.
мне нужно модифицировать все конструкторы, а не только дефолтный.
Цитата
Может, тогда имеет смысл сделать шаблонным сам класс?
Сам класс не должен быть шаблонным
Цитата
Какой смысл в инициализации класса только типом?
Потребность такая. мне не нужен объект, мне нужен только тип.
Я понимаю, что цель не понятна, т.к. это вырвано из большого кода.
приведу пример побольше:
Код

struct C: A, B {
    template<template<typename> class V, typename T>
    constexpr C(V<T>&&, u8 val): A(V<T>(), val), B(B::Q<T>(), val + 1){}
    constexpr C(u8 val): C(Q<C>(), val){}
};

По-моему пример стал еще запутаннее ))

Спасибо за помощь. я понял, что это не получится. вариант передачей указателя решает задачу, просто он не совсем удобен.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
TarasProger
Дата 17.8.2015, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 5.8.2015

Репутация: нет
Всего: нет



Ivan., члены шаблонного класса не нуждаются в уточнении по одиночке, так как весь класс конкретизируется с одними и теми же типами-параметрами в декларации каждого своего экземпляра, или указателья на экземпляр. А с ним конкретизируются и все методы, конструкторы и деструкторы. Шаблон то всё равно абстрактен на столько, что не толко именованных экземпляров, но даже безымянных экземпляров производных классов иметь не может, на основе его сначала надо создать более конкретный класс, а потом уже его экземпляры.

Добавлено через 1 минуту и 29 секунд
Цитата(Ivan. @  14.8.2015,  19:36 Найти цитируемый пост)
я пока так и сделал, но что если конструктор сложный, или их и так уже 5 штук, перегрузив их будет уже 10.
Нда. Местоимение "их" что то перегрузит и при этом чем то будет. Учите русский, господин товаришь.

Добавлено через 3 минуты и 26 секунд
Цитата(Ivan. @  15.8.2015,  18:14 Найти цитируемый пост)
Сам класс не должен быть шаблонным
Ну ты уж определись.

PM MAIL   Вверх
tzirechnoy
Дата 17.8.2015, 13:19 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
Местоимение "их" что то перегрузит и при этом чем то будет.


Первое иестоимение их относится к существительному, предшэствующему местоимению, второе -- указывает на тожэ, что и первое.

 Конструкторов ужэ пять штук, и перегрузив конструкторы, их станет 10.

Вообще, если бы ты попробовал сделать то, что человек просил в качестве примера, то вопросы и проблемы были бы тебе очевидны.

И в связи с этим возникает вопрос -- какого хера ты лезешь поучать людей в топик, из которого тебе понятны в лучшэм случае отдельные слова, да и то не все?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.