Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
hoggy
6701 / 2883 / 494
Регистрация: 15.11.2014
Сообщений: 6,480
Завершенные тесты: 1
#1

[c++][bug][template][cross - platform] workaround for msvc`s compiler - C++

04.10.2017, 17:53. Просмотров 194. Ответов 6
Метки нет (Все метки)

добрый день.


следующий код успешно собирается gcc
http://rextester.com/OIRJ27111

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
#include <iostream>
#include <map>
 
template<class T> struct custom_type_name
{
    static std::string get_type_name() 
        { return "regular"; }
};
 
template<template<class...> class T, class...Args>
struct custom_type_name< T<Args...> >
{
    static std::string get_type_name() 
        { return "template"; }
};
 
template<class...Args>
struct custom_type_name< std::pair<Args...> >
{
    static std::string get_type_name() 
        { return "std::pair"; }
};
 
template<class T>
struct some;
 
int main()
{
    std::cout 
        << custom_type_name<int>::get_type_name() 
        << std::endl;
    
    std::cout 
        << custom_type_name< some<int> >::get_type_name() 
        << std::endl;
    
    std::cout 
        << custom_type_name<std::pair<int,int>>::get_type_name() 
        << std::endl;
}
но отказывается собираться в 2015 вижуал студии:

http://rextester.com/QLBP48969

Код
error C2976: 'std::pair': too few template arguments
note: see declaration of 'std::pair'
error C3203: 'pair': unspecialized class template can't be used as a template argument 
for template parameter 'T', expected a real type


вопросы как всегда все те же самые:
1.
студия опять налажала? сколько можно уже ж

2.
нужен обходной путь для студии.


в кратце суть задачи:

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

в общем случаем выводим деманглинговый typeid(type).name()
в остальных случаях срабатывают юзерские специализации.

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

но если тип - шаблонный,
то его можно специализировать отдельно.

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

проблема в том,
что студия не умеет в моральную частичную специализацию.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2017, 17:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [c++][bug][template][cross - platform] workaround for msvc`s compiler (C++):

[c++][rvalue][array] bug compiler visual studio? - C++
добрый день. следующий код работает в gcc/clang, и не работает в студиях (2015/2017) #include &lt;iostream&gt; int main() { ...

Union, new placement, strict-aliasing, cross-platform - C++
Доброго времени суток. Ниже представленный код вроде бы работает. Гонял его на компиляторах cl/mingw ...

[filesystem, cross-platform] посоветуйте библиотеку для работы с файловыми путями - C++
Добрый день. нужно что-то цивилизованное, что отвечает требованиям: 1. (важно) что бы можно было собирать целевой продукт...

Codeblocks. Can't find compiler executable in your configured search path's for GNU GCC COMPILER - C++
&quot;Can't find compiler executable in your configured search path's for GNU GCC COMPILER&quot; вот такое вот сообщение при запуске Code Blocks....

обнаружил bug в rad studio 2010 - C++ Builder
недавно поставил delphicbuilder_2010_3615_win с сайта производителя, так вот при компиляции проекта выскакивала ошибка, что компилятор не...

MSVC и template template classes - C++
Приветствую. Как в MSVC передать template template класс? Простой пример template&lt;template&lt;typename, typename&gt; class Return&gt; ...

6
GbaLog-
Любитель чаепитий
3030 / 1398 / 337
Регистрация: 24.08.2014
Сообщений: 4,965
Записей в блоге: 1
Завершенные тесты: 2
04.10.2017, 19:23 #2
а зачем у случая с std::pair вариадики?
там же известно кол-во параметров и оно всегда равно 2.
0
hoggy
6701 / 2883 / 494
Регистрация: 15.11.2014
Сообщений: 6,480
Завершенные тесты: 1
04.10.2017, 21:03  [ТС] #3
затем, что специализация выделяет имя шаблона с любым кол-вом параметров.
0
GbaLog-
Любитель чаепитий
3030 / 1398 / 337
Регистрация: 24.08.2014
Сообщений: 4,965
Записей в блоге: 1
Завершенные тесты: 2
05.10.2017, 06:24 #4
всё равно не понял, можете пояснить примером?
когда мы можем использовать вариадики в специализации для std::pair, но не можем использовать так:
C++
1
2
3
4
5
6
template<class T1, class T2>
struct custom_type_name< std::pair<T1, T2> >
{
    static std::string get_type_name() 
        { return "std::pair"; }
};
0
hoggy
6701 / 2883 / 494
Регистрация: 15.11.2014
Сообщений: 6,480
Завершенные тесты: 1
05.10.2017, 13:11  [ТС] #5
Цитата Сообщение от GbaLog- Посмотреть сообщение
когда мы можем использовать вариадики в специализации для std::pair, но не можем использовать так:
когда обнаружим:
что любые возможные специализации
под любые возможные шаблоны
различаются лишь именами этих шаблонов,
и количеством используемых ими аргументов.
и конечно же, мы захотим обобщить момент,
дабы не разводить каждый раз
практически одинаковую копипасту
под разные специализации:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    #define dNAME_THIS_TEMPLATE(type)               \
        template<class...Args>                      \
        struct custom_type_name< type<Args...> >    \
        {                                           \
            static std::string get_type_name()      \
            {                                       \
                return std::string( #type ) +       \
                    + "<"                           \
                    +   dMY::type_names<Args...>()  \
                    + ">";                          \
            }                                       \
        }
 
    dNAME_THIS_TEMPLATE(std::pair);
    dNAME_THIS_TEMPLATE(tools::stage);
    dNAME_THIS_TEMPLATE(ololo);
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
06.10.2017, 09:07 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от hoggy Посмотреть сообщение
нужен обходной путь для студии.
На правах идеи:
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
#include <iostream>
#include <map>
#include <string>
 
template<class T> struct custom_type_name
{
    static std::string get_type_name()
        { return "regular"; }
};
 
template <template <class...> class T1, template <class...> class T2>
struct is_same_template
    : std::false_type
{ };
template <template <class...> class T>
struct is_same_template<T, T>
    : std::true_type
{ };
 
#define dNAME_THIS_TEMPLATE(type)          \
    template <>                            \
    struct custom_type_name_selector<type> \
    {                                      \
        static std::string get()           \
            { return #type; }              \
    };
 
template <template <class...> class C>
struct custom_type_name_selector
{
    static std::string get()
        { return "template"; }
};
 
template <template<class...> class T, class...Args>
struct custom_type_name< T<Args...> >
{
    static std::string get_type_name()
        { return custom_type_name_selector<T>::get(); }
};
 
template <typename X>
struct ololo {};
 
dNAME_THIS_TEMPLATE(std::pair)
dNAME_THIS_TEMPLATE(ololo)
 
template<class T>
struct some;
 
int main()
{
    std::cout
        << custom_type_name<int>::get_type_name()
        << std::endl;
 
    std::cout
        << custom_type_name< some<int> >::get_type_name()
        << std::endl;
 
    std::cout
        << custom_type_name<std::pair<int,int>>::get_type_name()
        << std::endl;
    
    std::cout
        << custom_type_name<ololo<int>>::get_type_name()
        << std::endl;
}
http://rextester.com/IIBDJ10930
2
hoggy
6701 / 2883 / 494
Регистрация: 15.11.2014
Сообщений: 6,480
Завершенные тесты: 1
06.10.2017, 12:48  [ТС] #7
Цитата Сообщение от DrOffset Посмотреть сообщение
На правах идеи:
замечательное решение)
0
06.10.2017, 12:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2017, 12:48
Привет! Вот еще темы с ответами:

Cross-platform - C#
Приветствую! Ребята подскажите, если способ писать приложение для windows, Linux, Mac на подобие Xamarin-а?

LambdaNative: Cross-Platform Scheme - Lisp
LambdaNative: Cross-Platform Scheme Applications LambdaNative allows you to create native applications on iOS, Android, Blackberry, OS...

Cross-platform development environment written in Scheme - Lisp
LambdaNative is an open-source (BSD licensed) cross-platform development environment written in Scheme (Gambit-C), supporting Android, iOS,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru