Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637

Может ли функция бросать смешенные типы данных

15.11.2015, 19:39. Показов 4469. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!

Сижу переписываю свои нацарапанные методы (там с памятью работаю код коменчу и прочие)
И тут возник вопрос может ли метод возвращать разные типы данных, например:
C++
1
2
3
4
5
6
7
int foo(int index)
{
switch(index)
case 1: return 3; break;
case 2: return string answer="0"; break;
case 3: return true; break;
}
И если это возможно, как должна выглядит "int foo(int index)"

PS может вопрос и глупый но я что то не нашел на него ответа в гугле!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.11.2015, 19:39
Ответы с готовыми решениями:

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си?
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы: 1. Можете ли на понятным для...

Функция-друзья и внутриклассовые типы данных
Привет народ. Вот кароче: #include"stdafx.h" #include"iostream" using namespace std; class datak{ struct data{ int let; ...

Какие типы данных возвращает функция Val
Выдержка из справки по VBA (из Office 1997): Функция Val Возвращает числа, содержащиеся в строке, как числовое значение...

19
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
15.11.2015, 19:58
Mesteriis, decltype надо гуглить, кажется. И auto.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.11.2015, 20:00
Цитата Сообщение от Mesteriis Посмотреть сообщение
вопрос может ли метод возвращать разные типы данных
существует несколько способов как организовать
передачу произвольных типов данных.

то, что хотите вы - самый извращенный.

http://ideone.com/Oosgcb

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
33
34
35
36
37
38
39
40
41
#include <iostream>
using namespace std;
 
 
int foo(int index)
{
    switch(index)
    {
    case 1: return 3;
    case 2: throw string("text");
    case 3: throw bool(true); 
    }
    throw logic_error("ololo");
}
 
void example(int index)
{
    try
    {
        const int result = foo(index);
        std::cout << "returned int: '" << result <<"'\n";
    }
    catch(const string& answer)
    {
        std::cout << "returned string: '" << answer <<"'\n";
    }
    catch(bool b)
    {
        std::cout << "returned bool: " 
            << (b? "true" : "false")<<std::endl;
    }
}
 
int main() {
    
    example(1);
    example(2);
    example(3);
    
    return 0;
}
Добавлено через 28 секунд
Цитата Сообщение от gru74ik Посмотреть сообщение
decltype foo(int index)
это не будет работать.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
15.11.2015, 20:03
Цитата Сообщение от hoggy Посмотреть сообщение
это не будет работать
Да, я уже понял.

Добавлено через 1 минуту
У Праты есть такой пример:
C++
1
2
3
4
5
6
7
template<class T1, class T2> 
auto gt(T1 х, Т2 у) -> decltype (х + у)
{
    // some code
 
    return х + у; 
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 20:03
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
 
template <typename T>
auto foo( T t ) -> decltype( t + t )
{
    return t + t;
}
 
int main()
{
    std::cout << foo(   123  ) << std::endl;
    std::cout << foo(  1.23  ) << std::endl;
    std::cout << foo( std::string( "123" ) ) << std::endl;
}
Bash
1
2
3
246
2.46
123123
1
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
15.11.2015, 20:04  [ТС]
gru74ik, хорошая статья, особено порадовала цитата: Скотт Мейерс, например, по этому поводу пишет так: “I have no idea why type deduction for auto and for templates is not identical. If you know, please tell me!”

Но я несколько не о том, decltype тогда ... .... тогда ... короче не то, щя будем искать и думать)))
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 20:08
Я поторопился и не совсем правильно понял вопрос. Как я понял, возвращаемый тип может различаться в зависимости от значения целочисленного параметра?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.11.2015, 20:08
C++
1
2
3
4
5
template <typename T>
T foo();
 
foo<std::string>();
foo<float>();
1
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
15.11.2015, 20:12  [ТС]
castaway, Ам, не понял, ок еще раз прям вот простыми!
Допустим я передаю в метод переменную типа int и это не обсуждается, всегда только int.
Но функция в зависимости чему равен int возвращает или int или bool или string

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
возвращаемый тип может различаться в зависимости от значения целочисленного параметра
Именно
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 20:13
https://www.cyberforum.ru/blog... g2866.html
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.11.2015, 20:15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
enum Answer
{
    STRING,
    NUMBER,
};
 
void foo(void*& ptr, const Answer answer);
int main()
{
    void* result = nullptr;
    const Answer choice = STRING;
    foo(result, choice);
    switch(choice)
    {
        case STRING:
        {
                       std::string a = *((std::string*)result);
        }
            break;
    }
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.11.2015, 20:15
Лучший ответ Сообщение было отмечено Mesteriis как решение

Решение

Цитата Сообщение от gru74ik Посмотреть сообщение
У Праты есть такой пример:
это шаблон функции,
которая каждый раз будет возвращать только какой то один и тот же тип данных.

А ТС хочет иметь возможность из одной функции возвращать разные типы данных,
в зависимости от условий известных лишь времени выполнения, а не компиляции.

то есть, ему нужно:
1.
извращение на эксепшенах.
2.
небезопасная игра с функциями-элипсисами.
void foo(int, ... ) //<--- 3 точки позволяют передавать любые типы данных в любых количествах
3.
небезопасная игра с void*
4.
тормозной boost::any
5.
приседания вокруг вариативных типов данных.
например: boost::vatiant

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

это тот самый случай, когда ТС стоит задуматься:
не хочется ли ему чего-то слишком странного?
может быть пока ещё не поздно,
стоит остановится, и пересмотреть архитектуру проекта?
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
15.11.2015, 20:21
Цитата Сообщение от hoggy Посмотреть сообщение
извращение на эксепшенах
Цитата Сообщение от hoggy Посмотреть сообщение
тормозной boost::any
Цитата Сообщение от hoggy Посмотреть сообщение
приседания вокруг вариативных типов данных
Цитата Сообщение от hoggy Посмотреть сообщение
не хочется ли ему чего-то слишком странного?
hoggy, каков слог! Маэстро, Вы бесподобны!
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.11.2015, 20:22
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <vector>
#include <typeinfo>
 
template <typename T> struct rem_ref      { typedef T type; };
template <typename T> struct rem_ref<T &> { typedef T type; };
 
struct any {
    any() : m_content( 0 ) {}
 
    template <typename T>
    any( const T & value ) : m_content( new holder<T>( value ) ) {}
 
    any( const any & other ) : m_content( other.m_content ? other.m_content->clone() : 0 ) {}
 
    ~any() { delete m_content; }
 
    const std::type_info & type() const {
        return m_content ? m_content->type() : typeid( void );
    }
 
private:
    struct placeholder {
        virtual ~placeholder() {}
        virtual const std::type_info & type() const = 0;
        virtual placeholder * clone() const = 0;
    };
 
    template <typename T>
    struct holder : placeholder {
        holder( const T & value ) : held( value ) {}
        virtual const std::type_info & type() const { return typeid( T ); }
        virtual placeholder * clone() const { return new holder( held ); }
        T held;
    };
 
    placeholder * m_content;
 
    template <typename T> friend T * any_cast( any * );
};
 
template <typename T>
T * any_cast( any * operand ) {
    return operand && operand->type() == typeid( T ) ? & static_cast<any::holder<T> *>(operand->m_content)->held : 0;
}
 
template <typename T>
T * any_cast_ptr_to( any & operand ) {
    return any_cast<typename rem_ref<T>::type>( &operand );
}
 
struct A {
    int val;
    A( int val ) : val( val ) {}
};
 
 
any & foo( int i ) {
    switch ( i ) {
        case 0: return *(new any( 123 ));
        case 1: return *(new any( 12.3 ));
        default: return *(new any( std::string( "123" ) ));
    }
}
 
int main()
{
    for ( int i = 0; i < 3; ++i ) {
        { // int
            int * p = any_cast_ptr_to<int>( foo( i ) );
            if ( p ) {
                std::cout << "int\t\t = " << *p << std::endl;
                continue;
            }
        }
 
        { // double
            double * p = any_cast_ptr_to<double>( foo( i ) );
            if ( p ) {
                std::cout << "double\t\t = " << *p << std::endl;
                continue;
            }
        }
 
        { // std::string
            std::string * p = any_cast_ptr_to<std::string>( foo( i ) );
            if ( p ) {
                std::cout << "std::string\t = " << *p << std::endl;
                continue;
            }
        }
    }
}
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.11.2015, 20:22
hoggy, gru74ik,
а я сижу и ржу представляя, что надо приседать вовремя компиляции и вовремя выполнения программы, чтобы всё работало )))
Цитата Сообщение от hoggy Посмотреть сообщение
приседания вокруг вариативных типов данных
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
15.11.2015, 20:23  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
не хочется ли ему чего-то слишком странного?
Да хочется, я знатный извращенец
Цитата Сообщение от hoggy Посмотреть сообщение
может быть пока ещё не поздно,
стоит остановится, и пересмотреть архитектуру проекта?
Это знаешь как быват, вот хочешь ты конфету а нельзя, ну вот хочешь и все,

Ладно всем спасибо за участия, идея сама по себе не плохая, но правда не к чему она, иначе как написано в статейке:
...то, получается, любую обычную функцию можно было бы объявить по сути неявно шаблонной...
А это не к чему!!!
кстати
Цитата Сообщение от hoggy Посмотреть сообщение
void foo(int, ... ) //<--- 3 точки позволяют передавать любые типы данных в любых количествах
Это что надо загуглить что бы почитать про "..."?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
15.11.2015, 20:25
Цитата Сообщение от Mesteriis Посмотреть сообщение
Это что надо загуглить что бы почитать про "..."?
Mesteriis, функции с переменным числом параметров.

Добавлено через 53 секунды
И, наверное, ещё variadic templates.
1
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
15.11.2015, 20:25  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
риседать вовремя компиляции и вовремя выполнения программы, чтобы всё работало )))
А вспомни win98 там по другому нельзя было! ))))
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.11.2015, 20:27
Цитата Сообщение от Mesteriis Посмотреть сообщение
Это что надо загуглить что бы почитать про "..."?
http://rsdn.ru/forum/cpp/418970.1
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
15.11.2015, 22:51
Цитата Сообщение от hoggy Посмотреть сообщение
любое из возможных решений будет потенциально не безопасным,
работать и выглядеть как последствие ущербного дизайна.
Цитата Сообщение от hoggy Посмотреть сообщение
например: boost::variant
Воу-воу, полегче boost::variant это ж реализация алгебраических типов. Ничего особо ужасного и небезопасного в них нет. Порой бывают очень полезны
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2015, 22:51
Помогаю со студенческими работами здесь

Функция проверки ввода, принимающая разные типы данных
Мне нужно написать функцию для проверки ввода, но так чтобы она могла делать свою работу, получая разные типы данных(char, int, float...

Может ли запись содержать вложенные сложные типы?
может ли запись содержать вложенные сложные типы? Если да, то, как их использовать?&amp;

Ни одна из 2 перегрузок не может преобразовать все типы аргументов
Привет почему компилятор ругаеться на это строку ChannelServices::RegisterChannel(http, false); Вот весь участок код HttpChannel...

Ошибка: ни одна из перегрузок не может преобразовать все типы аргументов
#include &quot;stdafx.h&quot; #include &quot;CppUnitTest.h&quot; #include &quot;/My Documents/Visual Studio...

Типы и функция mod
Здравствуйте, подскажите пожалуста что может быть неправильно? Перебрал вроде все и никак немогу понять почему он ругается на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru