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

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

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

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

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

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

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

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

46
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
14.02.2015, 15:56 41
Author24 — интернет-сервис помощи студентам
ну подозреваю что он говорит о том, что у 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
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
14.02.2015, 15:58 42
Цитата Сообщение от [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  [ТС] 43
Спасибо, заработало!
Цитата Сообщение от 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 44
наверно потому, что результат
bool2type<std::is_constructible<T, QWidget>::value
всегда false.
вместо T тут надо тип объекта _db поставить наверно
bool2type<std::is_constructible<decltype(_db), QWidget>::value
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
15.02.2015, 10:58 45
Воу-воу-воу, что как-то у вас все сложно. Можно ж 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  [ТС] 46
Лаконично.
Вопрос:
1. Как сделать, чтобы make() возвращал указатель (т.е. new T(_db, ui->tabWidget) или new T(ui->tabWidget))?
2. Можно ли избавиться от аргументов в функции make()? Те переменные, которые передаются в конструктор класса имеют глобальную область видимости.
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
16.02.2015, 12:48 47
Цитата Сообщение от [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
16.02.2015, 12:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2015, 12:48
Помогаю со студенческими работами здесь

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

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

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

Странное расположение в памяти аргументов функции с неизвестным количество аргументов
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки...


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru