0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
1

Написать аналог шаблонной функции без использования стандартной (и других библиотек)

21.10.2016, 06:46. Показов 1438. Ответов 7
Метки нет (Все метки)

Здравствуйте!
Набрел на вот такой вопрос по C++.
Implement a template function IsDerivedFrom() that takes class C and class P as template parameters. It should return true when class C is derived from class P and false otherwise.
Вот мой вариант ответа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class Base, class Derived>
bool IsDerivedFrom()
{
   bool result = false;
 
   using RemoveRefTypeBase = typename std::remove_reference<Base>::type;
   using RemoveRefTypeDerived = typename std::remove_reference<Derived>::type;
   
   using RemovePtrTypeBase = typename std::remove_pointer<RemoveRefTypeBase>::type;
   using RemovePtrTypeDerived = typename std::remove_pointer<RemoveRefTypeDerived>::type;
 
   using RemoveConstTypeBase = typename std::remove_const<RemovePtrTypeBase>::type;
   using RemoveConstTypeDerived = typename std::remove_const<RemovePtrTypeDerived>::type;
 
   if (!std::is_same<RemoveConstTypeBase,RemoveConstTypeDerived>::value)
   {
      result = std::is_base_of<RemoveConstTypeBase, RemoveConstTypeDerived>::value;
   }
 
   return result;
}
Я хотел попросить экспертов написать вариант моего ответа используя raw C++, ваш код послужит просветительской цели (:
Спасибо.

Добавлено через 43 минуты
Сложности (в силу слабых знаний о шаблонах) возникли только с написанием собственного варианта is_base_of. Просьба помочь именно с этим шаблоном.
Остальные используемые шаблоны вроде получились правильно:
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
template<class T, class U>
struct IsSameClass
{
   static const bool value = false;
};
template<class T>
struct IsSameClass<T, T>
{
   static const bool value = false;
};
 
template<class T>
struct RemoveRef
{
   typedef T type;
};
template<class T>
struct RemoveRef<T&>
{
   typedef T type;
};
template<class T>
struct RemoveRef<T&&>
{
   typedef T type;
};
 
template<class T>
struct RemovePtr
{
   typedef T type;
};
template<class T>
struct RemovePtr<T*>
{
   typedef T type;
};
 
template<class T>
struct RemoveConstVolatile
{
   typedef T type;
};
template<class T>
struct RemoveConstVolatile<const T>
{
   typedef T type;
};
template<class T>
struct RemoveConstVolatile<volatile T>
{
   typedef T type;
};
template<class T>
struct RemoveConstVolatile<const volatile T>
{
   typedef T type;
};
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2016, 06:46
Ответы с готовыми решениями:

Сравнение строк без использования стандартной функции strncmp
Написать программу, которая сравнивает строки не использую стандартную функцию strncmp. При чем...

Генератор случайных чисел без использования стандартной функции
Нужен код генератора случайных чисел на c++ без использования функции rand(). Помогите пожалуйста ,...

Удаление символов из строки без использования стандартной функции delete
Как удалить символы из строки без использования стандартной функции delete? конкретно моя задача:...

Написать аналог стандартной функции обработки строк
Добрый день, помогите, пожалуйста! Необходимо написать аналог стандартной функции обработки...

7
16252 / 8816 / 2159
Регистрация: 30.01.2014
Сообщений: 15,227
21.10.2016, 08:48 2
cyberk20, Шаблон класса, параметром которого должны являться наследники определённого класса
1
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
21.10.2016, 09:41  [ТС] 3
DrOffset,
Я искал информацию по подобной реализации, но не нашел ничего что смог бы переварить.
Вы не могли бы разъяснить этот пример?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename D, typename B>
class IsDerivedFromHelper
{
    class No { };
    class Yes { No no[3]; };
    
    static Yes Test( B* );
    static No Test( ... );
public:
    enum { Is = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) };
    
};
 
 
template <class C, class P> 
bool IsDerivedFrom() {
    return IsDerivedFromHelper<C, P>::Is;
}
Спасибо.
0
16252 / 8816 / 2159
Регистрация: 30.01.2014
Сообщений: 15,227
21.10.2016, 10:05 4
Лучший ответ Сообщение было отмечено cyberk20 как решение

Решение

Цитата Сообщение от cyberk20 Посмотреть сообщение
Вы не могли бы разъяснить этот пример?
Два слова: разрешение перегрузки.
Есть две функции (Test), одна с параметром - указателем на B, у другой параметр - эллипсис.
Все знают, что эллипсис при разрешении перегрузки имеет очень низкий приоритет. В данном случае будет выбрана функция с указателм на B, если указатель на D может быть приведен к нему (чтобы бывает, когда у нас есть открытое наследование), или если B == D, в остальных случаях будет выбран вариант c ellipsis.
Выражение под sizeof вычисляется на этапе компиляции; выполняется разрешение перегрузки и sizeof вычисляет размер типа, который возвращает функция. В зависимости от результата разрешения перегрузки будет выбрана либо первая функция, либо вторая. Поэтому sizeof будет возвращать размер либо типа Yes, либо No, последующее сравнение c sizeof(Yes) при этом даст либо true, либо false.

Добавлено через 9 минут
Цитата Сообщение от cyberk20 Посмотреть сообщение
не нашел ничего что смог бы переварить.
Для легкого понимания прежде требуется довольно много труда, детальное знание тонкостей стандарта - приветствуется . При этом практическая польза бывает нечасто. Поэтому внимание этому уделяют не все С++ программисты.
Если заинтересовался, то начать можно с книжки "Шаблоны C++. Справочник разработчика", потом можно будет почитать "Современное проектирование на C++". Есть некоторое количество книг на английском, которые могут быть полезны:
* Advanced Metaprogramming in Classic C++
* C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond
Ну и, конечно, исходники соответствующих библиотек boost и других, которые имеют к этому отношение.
По С++11 в этом отношении наверняка тоже есть литература. Поищи сам.
2
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
21.10.2016, 10:31  [ТС] 5
DrOffset,
Cпасибо, очень доходчиво.
0
Любитель чаепитий
3732 / 1791 / 562
Регистрация: 24.08.2014
Сообщений: 5,992
Записей в блоге: 1
21.10.2016, 10:36 6
Цитата Сообщение от cyberk20 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
template<class T, class U>
struct IsSameClass
{
    static const bool value = false;
};
template<class T>
struct IsSameClass<T, T>
{
    static const bool value = false;
};
Тут ошибка.
1
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
21.10.2016, 10:46  [ТС] 7
DrOffset, насколько я понимаю что для работы с private/protected наследованием нужно использовать другой подход?
0
16252 / 8816 / 2159
Регистрация: 30.01.2014
Сообщений: 15,227
21.10.2016, 10:49 8
Цитата Сообщение от cyberk20 Посмотреть сообщение
насколько я понимаю что для работы с private/protected наследованием нужно использовать другой подход?
Да, там несколько более сложный код. Я его дал по ссылке выше.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2016, 10:49
Помогаю со студенческими работами здесь

Написать функцию-аналог стандартной функции INSTR
Написать функцию-аналог стандартной функции INSTR (число, строка поиска, исходная строка),...

Написать аналог стандартной функции обработки строк
Помогите, пожалуйста! Нужно написать программу, которая обрабатывает символьные массивы для двух...

Реально ли написать программы С++ без использования библиотек ?
1)Реально ли писать программы С++ без использования библиотек ? 2)оно того стоит ?

Извлечение подстроки из строки (без использования библиотек функции)
Извлечение подстроки из строки (без использования библиотек функций). Помогите чем кто может,...

Аналог шаблонной функции
Добрый вечер! Есть задание: Написать родовую функцию в виде функции-шаблона. Функция меняет...

Пример простейшего калькулятора на PHP без перезагрузки страницы (чистый Ajax, без jQuery и других библиотек)
Привет. Это, в каком-то смысле, продолжение креатива...


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

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

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