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

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

Войти
Регистрация
Восстановить пароль
 
Dark Byte
-17 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
#1

Отделить описание шаблонных функций и классов от реализации - C++

14.11.2014, 21:03. Просмотров 845. Ответов 11
Метки нет (Все метки)

скажите можно ли как то все таки отделить описание шабонных функций и классов от реализации? уж больно неудобно всю рализацию в h-нике писать... а иначе ошибки лезут...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2014, 21:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отделить описание шаблонных функций и классов от реализации (C++):

Сравнение типов шаблонных классов - C++
Добрый день. Есть некоторый шаблонный класс (структура): template<int m, int n> struct A { }; Возьмем некоторый...

Параметры-шаблоны у шаблонных классов - C++
Объясните плз, кто может, для чего используются параметры-шаблоны у шаблонных классов, и как они работают? :) Читаю Прату и застрял на...

Объявление статических констант шаблонных классов - C++
Что-то я туплю - дан шаблонный класс, принимающий в качестве аргументов шаблона типы Type1 и Type2. В классе есть статическая константа...

Не получается создать объекты шаблонных классов - C++
#include <iostream> using namespace std; template<class T> class My_Class1 { private: char name; My_Class1 A; public: ...

Перегрузка шаблонных функций - C++
Есть шаблонный класс А, шаблонный параметр которого - это тип его поля. Есть шаблонные классы В и С, шаблонные параметры которых - тип...

Использование шаблонных функций - C++
Разработайте программу с шаблонными функциями для типов int, float и double. Данные в функции передаются в качестве параметров....

11
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.11.2014, 21:11 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Dark Byte, можно разделить на два h. В одном определения, в другом - реализация, схема примерно такая:
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
// test.h
#ifndef TEST_H
#define TEST_H
 
template <typename T>
void foo(T const & f);
 
//....
//другие объявления
//....
 
#include "test_impl.hpp"
 
#endif
 
// test_impl.hpp
#ifndef TEST_IMPL_HPP
#define TEST_IMPL_HPP 
 
template <typename T>
void foo(T const & f)
{
    // реализация
}
 
// другие реализации
 
#endif
1
Dark Byte
-17 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
14.11.2014, 21:23  [ТС] #3
DrOffset, спасибо работает, хотя я предпочитаю юзать #pragma once
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.11.2014, 21:28 #4
Цитата Сообщение от Dark Byte Посмотреть сообщение
я предпочитаю юзать #pragma once
Это в данном вопросе непринципиально (т.е. мой пример не об этом).
0
Dark Byte
-17 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
14.11.2014, 21:41  [ТС] #5
еще маленький вопросик близко к теме: можно ли как то сделать функцию доступной только в h-нике? т.е. вот такая вот шаблонная функция у которой реализация в h-нике, даже если я вынесу реализацию в другой h-ник она все равно будет видна из того юнита в который приинклудится этот h-ник, эта функция вообще как бы такая промежуточная, она не должна быть видна в этом h-нике, но в этом же h-нике есть еще одна шаблонная функция которая вызывает ее... в общем так вот запутанно, надеюсь кто нибудь сможет разобраться
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.11.2014, 21:51 #6
Dark Byte,
Речь не об этом случайно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// test.h
#ifndef TEST_H
#define TEST_H
 
void a_foo() // эту функцию надо скрыть?
{
}
 
void b_foo()
{
    a_foo();
}
 
#endif
0
Dark Byte
-17 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
14.11.2014, 22:50  [ТС] #7
DrOffset, ну по типу, только обе функции шаблонные... ах да, сейчас я сделал немного по другому и у меня еще вопрос возникает: вот допустим если ваш пример взять я функцию b_foo завернул в неймспейс, так вот теперь у меня она не видит функцию a_foo, ах да забыл сказать они обе с одинаковыми именами (перегрузка) в общем... вот функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename ...Types>
void* scanmem(void* ptr, Types& ...args)
{
    return ptr;
}
 
template<typename T, typename ...Types>
void* scanmem(void* ptr, T& value, Types& ...args)
{
    if (!ptr) return nullptr;
    value = *static_cast<T*>(ptr);
    return scanmem(static_cast<unsigned char*>(ptr)+sizeof(T), args...);
}
так вот основную функцию scanmem я завернул в неймспейс, а ту которая выходит как бы побочная, для реализации этих variadic templates мне надо скрыть... но тут еще кое что у меня в связи с эти не заладилось: scanmem с 3 параметрами (основная) видит теперь только себя и у нее вызывает ошибку вызов на 12 строке, тогда я поставил там расширение области видимости ::scanmem при вызове, но так она наоборот видит только ту с одним параметром, хоть ошибок нет, но так она работает только для первого аргумента короче хз как быть... можно конечно не заморачиваться и все оставить без неймспейсов и с доступностью из h-ника, но хотелось просто красиво оформить, чтобы можно было потом с удобством юзать
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.11.2014, 22:56 #8
Dark Byte, для внутренних функций обычно используют неймспейс detail или impl, внутри основного неймспейса. Таким образом, эти функции как бы скрываются от случайного использования.
C++
1
2
3
4
5
6
7
8
9
namespace mylib
{
    namespace detail
    {
          void my_detail_func() {}
    }
 
    void my_func() {   detail::my_detail_func();  }
}
далее используем mylib::my_func().
0
Dark Byte
-17 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
14.11.2014, 23:00  [ТС] #9
DrOffset,
1. но ведь неймспейс detail будет доступен и снаружи...
2. я с тем же успехом объявил ее вне неймспейса, проблема не в этом, проблема в том что такое указание более жесткое, а мне надо чтобы в нужный момент компилятор сам выбирал какую из этих двух функций ему вызывать... иначе он как я уже сказал обрабатывает только первый аргумент и на этом заканчивает...
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.11.2014, 23:25 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Dark Byte Посмотреть сообщение
1. но ведь неймспейс detail будет доступен и снаружи...
Будет. Но чтобы про это узнать нужно лезть в h-файл. А в документации об этом ни слова не будет. Нормальный человек поймет, что функция для внутреннего использования, это защита только от случайного использования.

Цитата Сообщение от Dark Byte Посмотреть сообщение
я с тем же успехом объявил ее вне неймспейса, проблема не в этом, проблема в том что такое указание более жесткое, а мне надо чтобы в нужный момент компилятор сам выбирал какую из этих двух функций ему вызывать...
Обе функции выноси в detail, а для использования создай третью, которая будет инициировать вызов из detail. Эта косвенность соптимизируется при сборке.

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
namespace detail  // for internal usage
{
 
template<typename ...Types>
void* scanmem(void* ptr, Types& ...args)
{
    return ptr;
}
 
template<typename T, typename ...Types>
void* scanmem(void* ptr, T& value, Types& ...args)
{
    if (!ptr) return nullptr;
    value = *static_cast<T*>(ptr);
    return scanmem(static_cast<unsigned char*>(ptr)+sizeof(T), args...);
}
 
} // detail
 
//.....
 
template<typename T, typename ...Types>
void* scanmem(void* ptr, T& value, Types& ...args)
{
    return detail::scanmem(ptr, value, args...);
}
1
Dark Byte
-17 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
14.11.2014, 23:29  [ТС] #11
DrOffset, спасибо работает
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.11.2014, 23:29 #12
Dark Byte, можно скрыть функции, используя вместо неймспейса класс, а функции в нем сделать приватными статическими. Внешнюю функцию сделать другом этому классу, он сможет вызывать эти статические функции, а никто другой не сможет. Но это лично мне кажется переусложнением. Обычно в проектах используют именно вариант с отдельным неймспейсом.
0
14.11.2014, 23:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2014, 23:29
Привет! Вот еще темы с ответами:

Перегрузка шаблонных функций - C++
Есть сруктура box и два шаблоны для поиска максимального числа. Один для встроенных типов а второй для структуры. Если в функцию передается...

Использование шаблонных функций - C++
Всем привет) Очень нужна помощь. нужно написать прогу для поиска максимального и минимального значения линейного массива, подогнать её...

Задания на стеки/очереди (без шаблонных классов stack, queue) - C++
Помогите, пожалуйста. Нужно добавить в очередь нечетные целые числа от -3 до 3. Все числа из очереди извлекать по одному и отрицательные...

Переделать код с помощью шаблонных функций - C++
нужно переделать этот кд и написать с помощью шаблон функций (template) . помогите пожалуйста #include &quot;stdafx.h&quot; #include...


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

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

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