Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
LosAngeles
Заблокирован
#1

шаблоны - C++

31.07.2011, 11:36. Просмотров 3008. Ответов 61

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename T>
class Class {
  private:
 
    template<typename C> bool func(C const& x, C const& y, int C::*)
    {
        return true;
    }
 
    template<typename C> bool func(...)
    {
        return false;
    }
 
  public:
    bool operator()(T const& lhs, T const& rhs)
    {
        return func<T>(lhs, rhs, 0);
    }
};
пример конечно неважный, но суть ясна - в зависимости от того, что подставлять заместо Т этот недофунктор ведёт себя по разному. Пользователь не видит ужасного быдлокода между строками 5-13 и это радует, но не совсем. Я тут подумал может как то присобачить можно этот пример из книжки по шаблонам:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T>
class IsClassT {
  private:
    typedef char One;
    typedef struct { char a[2]; } Two;
    template<typename C> static One test(int C::*);
 
    template<typename C> static Two test(...);
  public:
    enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
    enum { No = !Yes };
};
вдруг я ещё захочу пятьсот классов написать, а такой синтаксис нагоняет тоску... Можно как-то эти Yes и No присобачить заместо int C::*?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2011, 11:36     шаблоны
Посмотрите здесь:

Шаблоны - C++
Выполнить задание без использования библиотеки стандартных шаблонов. а) Создать шаблонную функцию поиска по заданному ключу. Функция...

Шаблоны С++ - C++
Существует ли ограничение типа параметра шаблона в C++? То, что нельзя использовать шаблоны функций в качестве параметров шаблонов, это...

Шаблоны C++ - C++
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке int out_param = (int)param;...

Шаблоны в C++ - C++
Доброго времени суток! Начал разбираться что такое шаблон и с чем его едят. Загуглил, вставил код из википедии. Ошибка. ...

шаблоны - C++
Помогите пож. разобраться с шаблонами. Шаблоны у которых параметры тоже шаблоны. из книги: tamplate&lt;typenamy T&gt;class Thing здесь...

Шаблоны - C++
Здравствуйте. Читая про шаблоны в Википедии (https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_C%2B%2B) ...

Шаблоны C++11 - C++
#include &lt;iostream&gt; template&lt;typename T1, typename T2&gt; auto func(T1 a, T2 b) -&gt; decltype(a&gt;b?b:a) { return a&gt;b?b:a; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.08.2011, 12:19     шаблоны #46
Mr.X, да я в VS2008 тоже пробовал. Проблема у неё с IsClassT. На счёт стандарта не уверен, но похоже.

Добавлено через 1 минуту
Цитата Сообщение от LosAngeles Посмотреть сообщение
попробуй заменить 14 на
Ага, так работает.
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2011, 12:22     шаблоны #47
Цитата Сообщение от LosAngeles Посмотреть сообщение
попробуй заменить 14 на
C++
1
enum { Yes = sizeof(test<T>(0)) == 1 };
Мда, а я почему-то посчитал, что люди это уже скомпилировали, поэтому и не вглядывался особо...
LosAngeles
Заблокирован
01.08.2011, 12:31  [ТС]     шаблоны #48
ещё, если добавить template должно работать
enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == 1 };
глава 5 5.1 в книге по шаблонам.

Не по теме:

После выхода стандарта придётся покупать новое издание, много чего можно переработать, многие ограничения шаблонов функций вроде обещали убрать + decltype неплохо бы упомянуть в главе про promotionTraits, хотя это только для встроенных типов замена, auto и ещё много всякого добра...

grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.08.2011, 12:59     шаблоны #49
Цитата Сообщение от Mr.X Посмотреть сообщение
Мда, а я почему-то посчитал, что люди это уже скомпилировали, поэтому и не вглядывался особо...
Ну я компилировал. В GCC. В нём исходный вариант без проблем.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 13:09     шаблоны #50
Цитата Сообщение от LosAngeles Посмотреть сообщение
decltype неплохо бы упомянуть в главе про promotionTraits, хотя это только для встроенных типов замена
ложь.
что за книга?

Добавлено через 2 минуты
пример:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <string>
#include <vector>
#include <iostream>
 
int main() {
   std::vector<std::string> vs{"1", "2"}; // initializer list
   decltype(vs) vs2 = vs; // decltype
   for ( auto it: vs2 ) { // range-based for
      std::cout << it << std::endl;
   }
}
http://liveworkspace.org/code/f62a83...f22b3ec9fa0896
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.08.2011, 13:13     шаблоны #51
Цитата Сообщение от LosAngeles Посмотреть сообщение
ещё, если добавить template должно работать
enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == 1 };
глава 5 5.1 в книге по шаблонам.
а вот добавление ::template на результат не влияет. MSVC2008 по прежнему не переваривает код, а GCC4.5.1 переваривает. Так что без IsClassT<T>:: получился более универсальный вариант. У меня он на 2 компиляторах работает
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 13:16     шаблоны #52
Цитата Сообщение от grizlik78 Посмотреть сообщение
У меня он на 2 компиляторах работает
оно и должно работать. не знаю что за MSVC2008..
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.08.2011, 13:20     шаблоны #53
Цитата Сообщение от niXman Посмотреть сообщение
не знаю что за MSVC2008..
Microsoft Visual C++ 2008
LosAngeles
Заблокирован
01.08.2011, 13:21  [ТС]     шаблоны #54
Цитата Сообщение от niXman Посмотреть сообщение
ложь.
что за книга?
А как с decltype можно решить какой тип сильнее не для встроенных типов? Что-то я не вижу решения. Да и для встроенных если взять decltype от суммы инта и дабла, он же вернёт дабл. А ведь не факт что сильный тип это тот, который вместительней, может кто-то захочет из чара и дабла продвинуть чар?
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 13:23     шаблоны #55
Microsoft Visual C++ 2008
где-то слышал про такое...

Добавлено через 47 секунд
Цитата Сообщение от LosAngeles Посмотреть сообщение
какой тип сильнее
это как?

Добавлено через 1 минуту
LosAngeles, все что я хотел сказать тем комментом - что в книге написана ложь про decltype.
LosAngeles
Заблокирован
01.08.2011, 13:27  [ТС]     шаблоны #56
судя по примеру ты прочитал так:
decltype
cut
неплохо бы упомянуть в главе про promotionTraits, хотя это
только для встроенных типов замена
что конечно не верно
потому что пример ни о чём про продвижение типов мне не сказал

Добавлено через 2 минуты
это не в книге написано, это моё личное соображение, вполне вероятно я ошибаюсь, но пока я не вижу как decltype решает проблему выбора более сильного типа. Только для встроенных и только на основании размера этих типов, что не есть гибко
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 13:31     шаблоны #57
Цитата Сообщение от LosAngeles Посмотреть сообщение
продвижение типов
а это что?

Добавлено через 43 секунды
Цитата Сообщение от LosAngeles Посмотреть сообщение
выбора более сильного типа.
это что такое?
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2011, 13:31     шаблоны #58
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну я компилировал. В GCC. В нём исходный вариант без проблем.
Т.е. мой вопрос о несоответствии MSVS 2008 стандарту остается в силе?
А MSVS 2010 компилирует?
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.08.2011, 13:43     шаблоны #59
Цитата Сообщение от Mr.X Посмотреть сообщение
Т.е. мой вопрос о несоответствии MSVS 2008 стандарту остается в силе?
А MSVS 2010 компилирует?
2010 у меня нет. А про стандартность мне трудно ответить. Статическая функция класса вызывается внутри определения класса, так что IsClassT<T>:: вроде как не нужен. А вот не нужен или не обязателен, это я не возьмусь утверждать.

Добавлено через 6 минут
Цитата Сообщение от niXman Посмотреть сообщение
продвижение типов
а это что?
Type promotion, видимо. Или это тоже непонятно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 13:45     шаблоны
Еще ссылки по теме:

Шаблоны - C++
ругается на строку &quot;friend class List&lt;T&gt;;&quot;, вот что пишет: 1&gt;c:\users\slava\documents\visual studio...

Шаблоны в C++ - C++
Здравствуйте! Написал такой код: #include &lt;QtCore/QCoreApplication&gt; #include &lt;iostream&gt; #include &lt;string&gt; using namespace...

Шаблоны - C++
На сколько я знаю, в с++ нельзя указать типу шаблона что то вроде: &lt;T extends MyClass&gt; Поэтому такой код: class A { public: ...

Шаблоны - C++
В файле есть такое определение template&lt;int32 aMaxLength&gt; class TTextBuffer: public MString { public: /** Construct an empty...

Шаблоны - C++
// Шаблоны.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace...


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

Или воспользуйтесь поиском по форуму:
LosAngeles
Заблокирован
01.08.2011, 13:45  [ТС]     шаблоны #60
C++
1
2
3
4
5
template<typename T, typename U>
auto myFunc(T t, U u) -> decltype (t + u) 
{ 
     return t + u.; 
};
без decltype и auto возник бы вопрос возвращать T или U, а decltype продвинет более сильный тип. Возможно большинство устраивает, что он автоматом из дабла и инта выберет дабл. А возможно потребуется обратная ситуация, то тут он не поможет. А для пользовательских типов совсем не поможет?

Вандервурд и Джосатис называют это PromotionTraits ну или по русски это буквально значит свойство продвижение
Yandex
Объявления
01.08.2011, 13:45     шаблоны
Ответ Создать тему
Опции темы

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