67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
1

Можно ли использовать поля enum в сигнатуре

27.10.2020, 20:25. Показов 1150. Ответов 14
Метки нет (Все метки)

Добрый день. Есть enum, поля которого я бы хотел использовать, чтобы перегружать функцию. Например:
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
enum Notations
{
    binary = 2,
    ternary = 3,
    quaternary = 4,
    octal = 8,
    decimal = 10,
    duodecimal = 12,
    hexadecimal = 16,
    vigesimal = 20,
    sexagesimal = 60
};
 
double convert (binary, decimal, string& value); 
// в зависимости от первых двух элементов я бы мог перегружать функцию
 
int main()
{
int 
source,
destination;
string value;
cin >> source >> destination >> value
Notations
    source_notation = static_cast<Notations>(source),
    destination_notation = static_cast<Notations>(destination);
cout << convert(source_notation,destination_notation, value) << endl;
}
Однако компилятор пишет, что binary и decimal не являются именем типа. Соответственно, вопрос, как такой функционал я мог бы реализовать? Enum решил использовать для наглядности кода. Возможно, данную фишку можно реализовать по-другому
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2020, 20:25
Ответы с готовыми решениями:

Можно ли использовать триггеры в случае изменения поля в классе?
Используется паттерн MVVM. Можно ли изменить цвет текста текстбокса на форме, используя какой-либо...

Создать класс, содержащий поля, которые можно использовать для хранения данных
Создать класс &lt;имя класса&gt; (имя класса задается в соответствии с выбранным вариантом), содержащий...

В laravel 5.4 использовать enum-ы
Подскажите, в laravel 5.4 хочу использовать enum-ы и подключаю библиотеку...

Где использовать Enum?
C# Enum где его использовать ? смотрел на него , да смотрел , пробывал по щупать щупальцами ...

14
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 20:49 2
Цитата Сообщение от SoBadDay Посмотреть сообщение
Однако компилятор пишет, что binary и decimal не являются именем типа. Соответственно, вопрос, как такой функционал я мог бы реализовать? Enum решил использовать для наглядности кода. Возможно, данную фишку можно реализовать по-другому
C++
1
double convert (std::integral_constant<Notations, binary>, std::integral_constant<Notations, decimal>, string& value);
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <Notations, Notations> struct convert;
 
template <> 
struct convert<binary, decimal>
{
    double operator()(const std::string &s) const 
    {
        return 0;
    }
};
 
auto x = convert<binary, decimal>()("1234");
0
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
27.10.2020, 20:57  [ТС] 3
oleg-m1973, Спасибо, пробую!

Добавлено через 7 минут
Пишет, что binary не определен

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum class Notations
{
    binary = 2,
    ternary = 3,
    quaternary = 4,
    octal = 8,
    decimal = 10,
    duodecimal = 12,
    hexadecimal = 16,
    vigesimal = 20,
    sexagesimal = 60
};
 
template <Notations, Notations> struct convert;
 
template <>
struct convert<binary, decimal>
{
    double operator()(const std::string& s) const
    {
        return 0;
    }
};
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 20:59 4
Цитата Сообщение от SoBadDay Посмотреть сообщение
Пишет, что binary не определен
Покажи, как сделал
0
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
27.10.2020, 21:11  [ТС] 5
oleg-m1973,
C++
1
struct convert<Notations::binary, Notations::binary>
Если так написать, вроде, работает
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 21:13 6
Цитата Сообщение от SoBadDay Посмотреть сообщение
Если так написать, вроде, работает
А, ну да. У тебя ж там enum class. Поэтому надо добавлять Notations::

Добавлено через 1 минуту
Если бы оставил просто enum Notations, тогда не нужно было бы
1
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
27.10.2020, 21:20  [ТС] 7
oleg-m1973,
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
#pragma once
#include "Header.h"
 
enum Notations
{
    binary = 2,
    ternary = 3,
    quaternary = 4,
    octal = 8,
    decimal = 10,
    duodecimal = 12,
    hexadecimal = 16,
    vigesimal = 20,
    sexagesimal = 60
};
 
 
template <Notations, Notations> struct convert;
 
template <>
struct convert<binary, decimal>
{
    double operator()(const std::string& s) const
    {
        return 0;
    }
};
 
cout << convert<source_notation, destination_notation>(value);
Пишет, C++ выражение должно иметь константное значение. значение переменная "destination_notation" (объявлено в строке 67) невозможно использовать как константу
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 21:22 8
Цитата Сообщение от SoBadDay Посмотреть сообщение
Пишет, C++ выражение должно иметь константное значение. значение переменная "destination_notation" (объявлено в строке 67) невозможно использовать как константу
Что это ещё за destination_notation?
0
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
27.10.2020, 21:26  [ТС] 9
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Что это ещё за destination_notation?
Давайте я Вам еще раз объясню, что программа должна делать.
Цитата Сообщение от SoBadDay Посмотреть сообщение
enum Notations
{
    binary = 2,
    ternary = 3,
    quaternary = 4,
    octal = 8,
    decimal = 10,
    duodecimal = 12,
    hexadecimal = 16,
    vigesimal = 20,
    sexagesimal = 60
};
double convert (binary, decimal, string& value);
// в зависимости от первых двух элементов я бы мог перегружать функцию
int main()
{
int
source,
destination;
string value;
cin >> source >> destination >> value
Notations
    source_notation = static_cast<Notations>(source), //переменная типа Notations, указывающая из какой системы нужно перевести
    destination_notation = static_cast<Notations>(destination); //переменная типа Notations, указывающая в какую систему нужно перевести
cout << convert(source_notation,destination_notation, value) << endl;
}
Функция как бы должна видеть, переменные какого типа (в данном случае binary в decimal) идут на вход и в зависимости от них выбирать нужную перегрузку
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 21:29 10
Цитата Сообщение от SoBadDay Посмотреть сообщение
Давайте я Вам еще раз объясню, что программа должна делать.
Просто так ты это не сделаешь. Это compile-time параметры, их можно указывать только константами

Добавлено через 1 минуту
Это можно сделать только через вложенные switch для каждой пары параметров, или типа того
0
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
27.10.2020, 21:30  [ТС] 11
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это можно сделать только через вложенные switch для каждой пары параметров, или типа того
Эхх, а так хотелось от этого уйти. Печаль и боль
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 21:33 12
Цитата Сообщение от SoBadDay Посмотреть сообщение
Эхх, а так хотелось от этого уйти. Печаль и боль
Здесь ты ничего не поделаешь. В runtime только так. Я бы воспользовался макросами
0
67 / 42 / 30
Регистрация: 26.03.2019
Сообщений: 269
27.10.2020, 22:04  [ТС] 13
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Я бы воспользовался макросами
Не изучал ещё такого "хорька". О чем речь? Есть пример?

Добавлено через 29 минут
oleg-m1973,
Я тут покумекал, можно создать структуры соответствующим системам счисления, и тогда перегружать по ним.
C++
1
2
3
4
5
6
7
8
struct binary
{
};
struct decimal
{
};
 
string convert (binary b, decimal d, string& value);
А способ создания объектов нужных классов можно при помощи фабричного метода. Наконец-то появился стимул его изучать
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 22:07 14
Цитата Сообщение от SoBadDay Посмотреть сообщение
Я тут покумекал, можно создать структуры соответствующим системам счисления, и тогда перегружать по ним.
То же самое, только сбоку
0
DrOffset
27.10.2020, 22:26     Можно ли использовать поля enum в сигнатуре
  #15

Не по теме:

Цитата Сообщение от SoBadDay Посмотреть сообщение
Печаль и боль
Это на самом деле не так.
Статическая типизация и компилируемые языки - это благо на самом деле, вам нужно только проникнуться этой "философией", и начать использовать ее себе на пользу.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2020, 22:26

Как правильно использовать enum?
Хочу использовать enum для указания на номер элемента в массиве (в квадратных скобках), однако...

Одинаковые поля в разных enum-ах
Здравствуйте. Собственно вопрос про оформление в atmel studio (версия 7) Есть одно...

Как использовать один Enum в двух проектах по связной ссылке?
Такая ситуация есть два проекта в одном решении, первый собирается в DLL, второй в EXE, в одном и...

Как использовать куки, чтобы потом было можно их использовать в запросах
Скажите полажуйста! как добавить ! куки , чтобы потом было можно использовать в запросах! тоесть ...

Можно ли с помощью Random выбрать элемент перечисления Enum?
Доброе время суток, у меня возникла такая дилемма можно ли с помощью Random выбрать элемент...

Можно ли удалить из переменной типа enum одно из значений?
Можно ли удалить из переменной типа enum одно из значений? допустим, так название_перечесления...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru