Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615

Как узнать количество аргументов конструктора?

13.02.2015, 15:33. Показов 4727. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Как на этапе компиляции узнать, сколько аргументов имеет конструктор некоторого класса?
Нужно в шаблонной функции по переданному классу Type определить количество:
1. Если аргументов 1 шт, то
C++ (Qt)
1
Type *object = new Type(this);
2. Если аргументов 2 шт, то
C++ (Qt)
1
Type *object = new Type(this, "это строка");
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2015, 15:33
Ответы с готовыми решениями:

Как узнать количество аргументов в команде/строке?
Есть команда, или можно сказать строка: /hello 144 12 155 Нужно узнать сколько аргументов в данной строке. В данном случае 3: 144, 12,...

Узнать количество пеледаваемых в функцию аргументов
Я про функсию с пелеменным колисеством алгументов.

Ошибка в списке аргументов конструктора
Добрый вечер, пишу программу по строкам с помощью классов. И вот выдаёт такую непонятню ошибку: #include <iostream> ...

46
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
14.02.2015, 15:56
Студворк — интернет-сервис помощи студентам
ну подозреваю что он говорит о том, что у Type нет конструктора, который принимает два или один параметр. зависит от Тype. Тут надо делать вызывать специальные create функции, которые либо перегружены, либо специализированы. В посте #6 они уже были:
C++
1
2
3
4
5
6
7
8
9
10
11
template<class T>
T create(bool2type<true>)
{
    return T("hello");
}
 
template<class T>
T create(bool2type<false>)
{
    return T();
}
кроме типа для разрешения перегрузки надо передавать в них параметры для создания. в одной из них
параметр db просто игнорировать.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.02.2015, 15:58
Цитата Сообщение от [progeR] Посмотреть сообщение
Не компилируется, т.к. не видит, как я понимаю, оператора if-else.
Если у одного из этих классов, например нет конструктора с двумя параметрами, то будет ошибка. Т.к. тернарный оператор требует вычислимости обоих свох выражений (как if, так и else). Обойти это можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename Type>
// if IS_SQL == true
typename std::enable_if<Type::IS_SQL, Type*>::type MainWindow::_addTab()
{
    return new Type(_db, ui->tabWidget);
}
template<typename Type>
// if IS_SQL == false
typename std::enable_if<!Type::IS_SQL, Type*>::type MainWindow::_addTab()
{
    return new Type(ui->tabWidget);
}
1
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
14.02.2015, 21:50  [ТС]
Спасибо, заработало!
Цитата Сообщение от DU Посмотреть сообщение
В посте #6 они уже были:
Попытался их использовать:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    template<bool> struct bool2type {};
    template<class T>
    T* create(bool2type<true>)
    {
        return new T(ui->tabWidget);
    }
    template<class T>
    T* create(bool2type<false>)
    {
        return new T(_db, ui->tabWidget);
    }
    template<class T>
    T* create()
    {
        return create<T>(bool2type<std::is_constructible<T, QWidget>::value>());
    }
Почему при компиляции видит только одну ветку (у меня это та, где false, а true не хочет)
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.02.2015, 00:31
наверно потому, что результат
bool2type<std::is_constructible<T, QWidget>::value
всегда false.
вместо T тут надо тип объекта _db поставить наверно
bool2type<std::is_constructible<decltype(_db), QWidget>::value
0
 Аватар для Voivoid
710 / 284 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
15.02.2015, 10:58
Воу-воу-воу, что как-то у вас все сложно. Можно ж sfinae замутить через автовывод возвращаемого типа. Т.е.:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
struct foobar {
    foobar( int a, int b ) {
        std::cout << "foobar created with " << a << " " << b << "\n";
    }
};
 
struct barbaz {
    barbaz( int a ) {
        std::cout << "barbaz created with " << a << "\n";
    }
};
 
template <typename T>
auto make( int a, int b ) -> decltype( T( a ,b ) ) {
    return T( a, b );
}
 
template <typename T>
auto make( int a, int b ) -> decltype( T( a ) ) {
    return T( a );
}
 
int main() {
    auto x = make<foobar>( 10, 42 );
    auto y = make<barbaz>( 10, 42 );
}
https://ideone.com/FjKzKI

Пололлировал с предложения впилить runtime полиморфизм не смотря на то, что все известно в compile-time. Вот что с людьми MFC делает
3
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
16.02.2015, 09:04  [ТС]
Лаконично.
Вопрос:
1. Как сделать, чтобы make() возвращал указатель (т.е. new T(_db, ui->tabWidget) или new T(ui->tabWidget))?
2. Можно ли избавиться от аргументов в функции make()? Те переменные, которые передаются в конструктор класса имеют глобальную область видимости.
0
 Аватар для Voivoid
710 / 284 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
16.02.2015, 12:48
Цитата Сообщение от [progeR] Посмотреть сообщение
Вопрос:
1. Как сделать, чтобы make() возвращал указатель (т.е. new T(_db, ui->tabWidget) или new T(ui->tabWidget))?
2. Можно ли избавиться от аргументов в функции make()? Те переменные, которые передаются в конструктор класса имеют глобальную область видимости.
Элементарно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <memory>
 
int g_a = 10;
int g_b = 42;  
 
struct foobar {
    foobar( int a, int b ) {
        std::cout << "foobar created with " << a << " " << b << "\n";
    }
};
 
struct barbaz {
    barbaz( int a ) {
        std::cout << "barbaz created with " << a << "\n";
    }
};
 
template <typename T>
auto make() -> decltype( new T( g_a ,g_b ) ) {
    return new T( g_a, g_b );
}
 
template <typename T>
auto make() -> decltype( new T( g_a ) ) {
    return new T( g_a );
}
 
int main() {
    foobar* x = make<foobar>();
    barbaz* y = make<barbaz>();
}
Другое дело, что глобальные переменные скорее все это весьма сомнительное решение, ну да и ладно, сам себе злобный буратина, лол
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2015, 12:48

Неправильная передача аргументов конструктора класса
Есть несколько конструкторов: student(char* name, char* group, int course, int marks){ strcpy(FIO, name); strcpy(this-&gt;group,...

Изменение параметров конструктора без аргументов
Как в конструкторе без параметров изменить значения из функции main?

Как узнать имя конструктора объекта
Всем доброго времени суток. Продолжаю разбираться с ООП в JS. Возникла проблема: хочу написать метод в базовом классе, который будет...

Три конструктора с разным количеством аргументов, какой использовать?
В 1-ом классе 3 конструктора, которые имеют разное кол-во аргументов(3 арг, 6 и 11). Теперь во 2-ом классе создан объект из 1-го, в...

Странное расположение в памяти аргументов функции с неизвестным количество аргументов
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки первой строки: void makeArr(char *str,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru