Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Шаблонный метод с разными параметрами

31.01.2016, 08:53. Показов 1344. Ответов 12
Метки нет (Все метки)

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

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

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
#include <iostream>
#include <string>
using namespace std;
//////////////////////////////////////////////////////////////////////////
enum class Types
{
    NONE,
 
    ONE,
    TWO,
    TEST,
};
//////////////////////////////////////////////////////////////////////////
class Foo
{
public:
    
    template <Types Pick, typename... Args >
    void set(Args... args);
 
    template <>
    void set<Types::NONE>(int, int)
    {
        cout << "set<Types::NONE>(int, int)" << endl;
    }
    template <>
    void set<Types::ONE>(std::string, float)
    {
        cout << "set<Types::ONE>(std::string, float)" << endl;
    }
    template <>
    void set<Types::TWO>(bool, const char* const)
    {
        cout << "set<Types::TWO>(bool, const char* const)" << endl;
    }
    template <>
    void set<Types::TEST>(int, int)
    {
        cout << "set<Types::TEST>(int, int)" << endl;
    }
 
};
//////////////////////////////////////////////////////////////////////////
int main()
{
    Foo a;  
    a.set<Types::NONE>(1,1);
    a.set<Types::ONE>(std::string(""), 3.1f);
    a.set<Types::TWO>(false, "");
    //a.set<Types::TEST>(2,4,5,6,7,2);
}
В голову лезит разве что наследники Case (TypeOneCase : public Case) c разными конструкторами и в void set(T); принимает только наследников Case, и вызов будет set(Foo::OneTypeCase("", 7.1f));


Хочется с вне вызвать set передать ему как-то значение enum и он мне подскажет что дальше вводить, а с учетом имён параметров пойму, что требуется
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.01.2016, 08:53
Ответы с готовыми решениями:

Разработать шаблонный класс Deque c разными методами
Разработать шаблонный класс Deque, который имеет следующие методы: - addBegin(n) - добавление в начало дека - addEnd(n) - добавление...

Шаблонный класс для работы с разными типами данных и объявление методов в main
есть класс шаблонный, но не могу объявить методы в main и сделать длядругих типов :(когда делала через шаблонные функции, то программа...

Конструктор с разными параметрами
...извините что обращаюсь, сам не местный...))) пробую создать обьект и написать конструктор. Загвоздка в том что в JS (кажеться)...

12
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.01.2016, 11:14
rikimaru2013, код не по стандарту. Нельзя определять полную специализацию в in-class scope.

Добавлено через 5 минут
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
говорит, что подходит всё
Так они и подходят все. Данные специализации могут быть вообще в другой единице трансляции, если что

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Хочется с вне вызвать set передать ему как-то значение enum и он мне подскажет что дальше вводить, а с учетом имён параметров пойму, что требуется
Сделай перегрузку нормальную.
Или
setOne
setTwo
и т.д. Тогда все увидит.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.01.2016, 11:52
http://rextester.com/YOYSN13267

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
#include <iostream>
#include <string>
using namespace std;
//////////////////////////////////////////////////////////////////////////
enum class Types
{
    NONE,
    ONE,
    TWO,
    TEST,
};
//////////////////////////////////////////////////////////////////////////
 
 
namespace detail{
    
    template <Types Pick, typename... Args >
    struct helper
    {
        static void help(Args&&...args)
        { cout << "set<PICK>(Args&&...args)" << endl; }                             
    };
        
#define dGENERATOR(type, ...)         \
    template <>                       \
    struct helper<type, __VA_ARGS__>  \
    {                                 \
        static void help(__VA_ARGS__) \
        {                             \
            cout << "set<Types::NONE>(" #__VA_ARGS__ ")" << endl; \
        }                             \
    }
        
        
    dGENERATOR(Types::NONE, int, int);
    dGENERATOR(Types::ONE,  std::string, float);
    dGENERATOR(Types::TWO,  const char* const);
    dGENERATOR(Types::TEST, int, int);
    
}//namespace detail
 
class Foo
{
public:
    
    template <Types Pick, typename... Args >
    void set(Args&&... args)
    {
        detail::helper<Pick, Args... >::help( std::forward<Args>(args)... );
    }
};
//////////////////////////////////////////////////////////////////////////
int main()
{
    Foo a;  
    a.set<Types::NONE>(1,1);
    a.set<Types::ONE>(std::string(""), 3.1f);
    
    a.set<Types::TWO>(false, "");  //<--- массив, а не указатель
    // специализация не сработает
    
    a.set<Types::TEST>(2,4,5,6,7,2);
}
1
31.01.2016, 12:04

Не по теме:

hoggy, собственно у него проблема-то в другом. Он хочет, чтобы автодополнение различало специализации и подсказывало в зависимости от первого шаблонного параметра соответствующее количество аргументов.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.01.2016, 12:11
Цитата Сообщение от DrOffset Посмотреть сообщение
hoggy, собственно у него проблема-то в другом. Он хочет, чтобы автодополнение различало специализации и подсказывало в зависимости от первого шаблонного параметра соответствующее количество аргументов.
это?
http://rextester.com/LNZD8785

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
#include <iostream>
#include <string>
using namespace std;
//////////////////////////////////////////////////////////////////////////
enum class Types
{
    NONE,
    ONE,
    TWO,
    TEST,
};
//////////////////////////////////////////////////////////////////////////
 
class Foo
{
public:
    
    template <Types Pick, typename... Args, 
    typename std::enable_if< Pick == Types::NONE>::type* = nullptr >
    void set(Args&&... args)
    {
        std::cout<<"NONE\n";
    }
    
    template <Types Pick, typename... Args, 
    typename std::enable_if< Pick == Types::ONE>::type* = nullptr >
    void set(Args&&... args)
    {
        std::cout<<"ONE\n";
    }
    
    template <Types Pick, typename... Args, 
    typename std::enable_if< Pick == Types::TWO>::type* = nullptr >
    void set(Args&&... args)
    {
        std::cout<<"TWO\n";
    }
    
    template <Types Pick, typename... Args, 
    typename std::enable_if< Pick == Types::TEST>::type* = nullptr >
    void set(Args&&... args)
    {
        std::cout<<"TEST\n";
    }
    
};
//////////////////////////////////////////////////////////////////////////
int main()
{
    Foo a;  
    a.set<Types::NONE>();
    a.set<Types::ONE>(std::string(""));
    a.set<Types::TWO>(false, "");  
    a.set<Types::TEST>(2,4,5,6,7,2);
}
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.01.2016, 12:20
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от hoggy Посмотреть сообщение
это?
Ну да. Почти.
Сделать точь в точь, как он хочет, с одинаковыми именами функции по-моему нельзя вообще. Можно дать разные имена (setOne, setTwo), тогда будет работать. А так все равно студия будет предлагать весь выбор доступных перегрузок.
Вернется ТС - скажет
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.01.2016, 12:27
Цитата Сообщение от DrOffset Посмотреть сообщение
А так все равно студия будет предлагать весь выбор доступных перегрузок.

Не по теме:

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

да и другие идешки тоже не лучше.

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
31.01.2016, 14:36  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
код не по стандарту
перечитал 14.7 раздел - только голова разболелась, а в сети все отсылки на стандарт старые аз 2008/2013 год. Все ссылаются на 14.7.4 а там ничего не ограничивает этот код.


Цитата Сообщение от DrOffset Посмотреть сообщение
собственно у него проблема-то в другом. Он хочет, чтобы автодополнение различало специализации и подсказывало в зависимости от первого шаблонного параметра соответствующее количество аргументов.
Да - такого и добываюсь -)

hoggy, оба кода intellisense не понимают, что от него хотят -((((

По идеи мне не нужно вы*пыватся и просто сделать на основе наследования

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
#include <iostream>
#include <string>
#include <type_traits>
using namespace std;
//////////////////////////////////////////////////////////////////////////
namespace Types
{
    struct Case
    {
    };
    struct CaseOne : public Case
    {
        CaseOne(int, int)
        {
            cout << "CaseOne(int, int)" << endl;
        }
    };
    struct CaseTwo : public Case
    {
        CaseTwo(float, std::string)
        {
            cout << "CaseTwo(float, std::string)" << endl;
        }
    };
}
//////////////////////////////////////////////////////////////////////////
 
class Foo
{
public:
    void set(const Types::Case& set)
    {
    }
    
 
};
//////////////////////////////////////////////////////////////////////////
int main()
{
    Foo a;
    a.set(Types::CaseOne(1, 1));
    a.set(Types::CaseTwo(3.2f, ""));
 
    
}
0
31.01.2016, 15:19

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
оба кода intellisense не понимают, что от него хотят
мой код он даже близко не понимает)
я решил забить и не париццо.
и стало у меня одной проблемой меньше))

0
31.01.2016, 15:22  [ТС]

Не по теме:

hoggy, :D =-O я всё пытаюсь писать, чтобы понять читая код чего я хотел спустя месяц -)

И да, макрос для ostream еще в моём сердце! Нашёл такого рода еще для удаления конструкторов синглтона

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
31.01.2016, 15:31
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Все ссылаются на 14.7.4 а там ничего не ограничивает этот код.
Не тот пункт: 14.7.3/2
An explicit specialization shall be declared in a namespace enclosing the specialized template.
К слову, 14.7.4 вообще нет в новых редакциях стандарта. Так что очень странно ты его читал

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
По идеи мне не нужно вы*пыватся и просто сделать на основе наследования
По идее нужно взять и сделать разные имена. Или забить на автодополнение (я вот им вообще не пользуюсь). А так - на лицо overengineering на ровном месте.
1
31.01.2016, 15:35  [ТС]

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Так что очень странно ты его читал
Я могу видеть завтрашний день!

P.S. читал за 2010-03-26 - фейл на фейле*( Надо спать, а не по ночам кодить (

0
31.01.2016, 15:49

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Надо спать, а не по ночам кодить (
Пока молодой - можно. Витаминчики только пей, авитаминоз и алкоголь - первые враги программиста :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.01.2016, 15:49
Помогаю со студенческими работами здесь

Добавить круги с разными параметрами
Всем привет) Сейчас разбираюсь с канвасом. Подскажите как сделать 7 кругов со случайными размерами, координатами, прозрачностью и цветом....

Перезапуск процесса с разными параметрами
Доброго Вечера. Есть такое задание. Нужно сделать скрип который запускает мой процесс с нужными параметрами: Как примеру первый...

Несколько макро с разными параметрами
Всем привет! Хочу определить в программе #define func(number) { call(number, 0); } #define func(number1, number2) {...

Вывод нескольких строк с разными параметрами
Здравствуйте. MySQL мне в новинку, а в интернете немного неполные объяснения функций. Задача: PHP: Есть список id пользователей через...

Вызов контроллера ApiControllera с разными параметрами
Доброго времени суток форумчане! Работаю с определёнными однотипными документами, решил сделать универсальный бекенд, т.к. документов...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru