Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегруженные функции 
:(
    Опции темы
borisbn
Дата 20.7.2010, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Если char * - это строковое представление числа ( типа char*("123") вместо DWORD(123) ), то можно написать 2 шаблонные функции преобразования аргумента в число:
Код

template< typename T > int toInt( T x ) { assert( 0 ); return 0; }
template<> int toInt< const char * >( const char * x ) {
    return atoi( x );
}
template<> int toInt< int >( int x ) {
    return x;
}

и далее

template< typename T1, typename T2, typename T3 > 
void func( T1 t_arg1,  T2 t_arg2, T3 t_arg3) {
int arg1 = toInt( t_arg1 );
int arg2 = toInt( t_arg2 );
int arg3 = toInt( t_arg3 );
}




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Abyx
Дата 20.7.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



borisbn, для этого есть lexical_cast
PM MAIL   Вверх
azesmcar
Дата 20.7.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(djamshud @  20.7.2010,  13:26 Найти цитируемый пост)
Поведение то одинаковое. Просто входные данные разнотипные. И шаблон с восемью специализациями только ради описания входного типа - жесточайший оверхед в плане кодонаписания. 

я и не предлагал писать 8 специализаций ради одной реализации, одной реализации с шаблонами вполне достаточно.
PM   Вверх
djamshud
Дата 20.7.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



>djamshud, немного проанализировав ваши посты, пришел к умозаключению, что ваш стиль написания кода, называется "Си с классами." прям 90еы..ужос..

Мой стиль - это "скрипты и си с классами, наследованиями, RTTI и шаблонами". А желание пихать шаблоны с бустом куда ни попадя - это симптом (не, ну метапрограммирование - это же так по-европейски, да и вообще как ни крути - просто ###ись), часто говорящий, что человек для решения задачи (и самое главное - выражения своих мыслей) использует немного не тот язык. Диагноз ставить не буду - не доктор:).

Добавлено через 1 минуту и 50 секунд
>я и не предлагал писать 8 специализаций ради одной реализации, одной реализации с шаблонами вполне достаточно.

Хм, ну вот я хоть убей не сображу, как это сделать. Как я понимаю, задача не в lexical_cast'e.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 20.7.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(djamshud @  20.7.2010,  14:15 Найти цитируемый пост)
Хм, ну вот я хоть убей не сображу, как это сделать

вообще-то довольно просто
Код

template <class A1, class A2, class A3> 
void foo(A1 a1, A2 a2, A3 a3)
{
    std::cout << a1 << a2 << a3 << std::endl;
}

я не думаю, что это необходимо, но если вдруг очень нужно, чтобы функция работала именно для char* и short (или что-то там еще) то этого тоже довольно легко добиться добавив static assert.
Код

template <typename T> struct mytype { enum { check = 0 }; };
template <> struct mytype<const char*> { enum { check = 1 }; };
template <> struct mytype<short> { enum { check = 1 }; };

template <class A1, class A2, class A3> 
void foo(A1 a1, A2 a2, A3 a3)
{
    BOOST_STATIC_ASSERT(mytype<A1>::check == 1);
    BOOST_STATIC_ASSERT(mytype<A2>::check == 1);
    BOOST_STATIC_ASSERT(mytype<A3>::check == 1);

    std::cout << a1 << a2 << a3 << std::endl;
}


PM   Вверх
djamshud
Дата 20.7.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



azesmcar, эммм... Я думаю, ТС хочет чего-то большего, чем просто распечатать аргументы. В общем нужно узнать, что именно делает его функция.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 20.7.2010, 14:49 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



ну вы же сами писали
Цитата(djamshud @  20.7.2010,  13:26 Найти цитируемый пост)
Поведение то одинаковое

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

PM   Вверх
Abyx
Дата 20.7.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



Цитата(azesmcar @  20.7.2010,  14:23 Найти цитируемый пост)
но если вдруг очень нужно, чтобы функция работала именно для char* и short (или что-то там еще) то этого тоже довольно легко добиться добавив static assert.


без ненужных энумов и бустовских статик ассертов
Код

template <typename T> struct is_not_my_type;
template <> struct is_not_my_type<const char*> {};
template <> struct is_not_my_type<short> {};

template <class A1, class A2, class A3> 
void foo(A1 a1, A2 a2, A3 a3)
{
    is_not_my_type<A1>();
    is_not_my_type<A2>();
    is_not_my_type<A3>();

    std::cout << a1 << a2 << a3 << std::endl;
}

int main()
{
   foo((short)1, 2, 3);
}


выдает ошибку
Код

In function 'void foo(A1, A2, A3) [with A1 = short int, A2 = int, A3 = int]':
t.cpp:18:   instantiated from here
Line 9: error: invalid use of undefined type 'struct is_not_my_type<int>'


Это сообщение отредактировал(а) Abyx - 20.7.2010, 14:59
PM MAIL   Вверх
borisbn
Дата 20.7.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Abyx, я atoi просто так написал, чтобы понятно было в какую сторону смотреть...
и вообще, мой пример может не пригодиться, если у этой функции в качестве char * аргументов не строковое представление чисел, а что-то другое.
Согласен со всеми, что без понимания, что должна эта функция делать ( или хотя бы что должны значить аргументы ), помочь ТС-ру сложно.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
djamshud
Дата 20.7.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



>вывод всего лишь пример одинакового поведения

Не совсем. Вывод - тривиальный пример одинакового поведения с учетом того, что дальнейший обработчик (в вашем примере это std::cout) уже перегружен работать с разными типами. Если совсем чуть-чуть усложнить задачу и предположить, что передаваться будет не null-terminated строка, даже простое распечатывание станет намного веселее. Но даже если не трогать входные параметры, можно придумать тысячу и один вариант нетривиального (одинакового) поведения сабжевой функции.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 20.7.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Abyx

Да, одно и тоже..конечно подключать boost ради этого не стоит smile 
Код

template <typename T> struct mytype { };
template <> struct mytype<const char*> { enum { check = 1 }; };
template <> struct mytype<short> { enum { check = 1 }; };
template <class A1, class A2, class A3> 
void foo(A1 a1, A2 a2, A3 a3)
{
    mytype<A1>::check;
    mytype<A2>::check;
    mytype<A3>::check;
    std::cout << a1 << a2 << a3 << std::endl;
}

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

Добавлено через 4 минуты и 38 секунд
djamshud

Какое же это тогда одинаковое поведение? либо обработка проходит одинаково, либо нет, тут третьего не надо, в первом случае функция одна, во втором их уже две, так как поведения разные для разных типов. 

Цитата(djamshud @  20.7.2010,  15:01 Найти цитируемый пост)
Если совсем чуть-чуть усложнить задачу и предположить, что передаваться будет не null-terminated строка, даже простое распечатывание станет намного веселее. 

тогда распечатка для типов char* и short будет разная, а значит и функции будут разные.

Это сообщение отредактировал(а) azesmcar - 20.7.2010, 15:05
PM   Вверх
djamshud
Дата 20.7.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



azesmcar, под одинаковым я подразумевал смысловое одинаковое поведение, а не то, что код для каждого аргумента будет один в один независимо от его типа. В общем то в теории перегрузка и в особенности шаблоны как раз и предназначены для этого, но на практике часто проще воспользоваться variant-ом в том или ином виде. Я про свою практику.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 20.7.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



variant предназначен несколько для другого, а именно для рантайм выборки типа..


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 20.7.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 20.7.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(djamshud @  20.7.2010,  14:38 Найти цитируемый пост)
 всего лишь один дополнительный условный переход

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


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0850 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.