Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2012, 21:58   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Вы считаете, что таким образом можно избежать копирования тяжелых объектов?
Компилятор оптимизировал
Но в принципе да, будет зависить от возможностей компилятора но когда речь идет о шаблонах это так или иначе принимается за данность - что компилятор справится.
waleri вне форума Ответить с цитированием
Старый 03.08.2012, 22:00   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну тогда так... добрый старый препроцессор:

Код:
template <typename type>
class TArgument
{
public:
    TArgument(type)
    {
    }
};

template <typename type>
TArgument<type> TGetArgument(const type& arg)
{
    return arg;
}
TArgument<int> TGetArgument(int val)
{
    return val;
}

template <typename type1, typename type2>
void TFunction(type1 a1, type2 a2)
{
}
#define TFunction(a, b)    TFunction(TGetArgument(a), TGetArgument(b))
Препроцессор не подойдет.... Он не позволяет делать перегрузку.
Механизм рассчитан на работу с разным количеством аргументов.
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 22:06   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Компилятор оптимизировал
Но в принципе да, будет зависить от возможностей компилятора но когда речь идет о шаблонах это так или иначе принимается за данность - что компилятор справится.
Реально - это не то, место, которое подходит для оптимизаций.
Сам я не шибко в этом понимаю, но эксперименты показывают - конструкторы запускаются.

Ну и ребят спрашивал, спецов по ассемблеру. Так они и вовсе сказали: косвенный вызов функций (или, о боже! Запуски конструкторов) - это не место для оптимизаций, за искл. тех, что прописаны в стандарте.
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 22:37   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Механизм рассчитан на работу с разным количеством аргументов.
Какой механизм?
waleri вне форума Ответить с цитированием
Старый 03.08.2012, 22:41   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Какой механизм?
Хороший механизм. Который будет использовать функцию Foo, и её возможные перегрузки в своих целях.
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 23:02   #16
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Ну раз вам не нравится препроцессор, вот вам то же самое без препроцесора. Не понимаю зачем все это нужно - все равно код такой функции не может быть универсальным а если есть специализация, тогда можда подгонять аргументы вручную... Изпользуйте VARIANT подобие и храните тип там - т.е. информацию о типе которая вам надо...

Код:
template <typename type>
class TArgument
{
public:
    TArgument(const type&)
    {
    }
};
template <>
class TArgument<int>
{
public:
    TArgument(int)
    {
    }
};

template <typename type>
void TFunction(TArgument<type> arg)
{
}
template <typename type>
void TFunction(const type& arg)
{
    TFunction(TArgument<type>(arg));
}
waleri вне форума Ответить с цитированием
Старый 03.08.2012, 23:24   #17
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну раз вам не нравится препроцессор, вот вам то же самое без препроцесора. Не понимаю зачем все это нужно - все равно код такой функции не может быть универсальным а если есть специализация, тогда можда подгонять аргументы вручную... Изпользуйте VARIANT подобие и храните тип там - т.е. информацию о типе которая вам надо...

Код:
template <typename type>
class TArgument
{
public:
    TArgument(const type&)
    {
    }
};
template <>
class TArgument<int>
{
public:
    TArgument(int)
    {
    }
};

template <typename type>
void TFunction(TArgument<type> arg)  //сломается при первом же инстансе. Нельзя вывести тип аргумента
{
}
template <typename type>
void TFunction(const type& arg)  //не удовлетворяет задачи
{
    TFunction(TArgument<type>(arg));
}
ё12233ё12233ё12233ё12233
_Bers вне форума Ответить с цитированием
Старый 04.08.2012, 00:24   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

TFunction(TArgument<type>) не предполагается вызывать напрямую, так что ничего ломаться не будет - надо было назвать TImplement как и раньше. Что касается второго замечания, то удовлетворяет задачу чуть лучше вашего варианта SOpt - те же type& но только сохраняется информация о типах. И я лично считаю, ТFunction будет соптимизирована и будет вызываться TFunction(TArgument) напрямую а там уже TArgument будет менятся в зависимости от типа.
waleri вне форума Ответить с цитированием
Старый 04.08.2012, 12:35   #19
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

waleri, если в функцию был передан константный объект - он должен быть принят по константной ссылке. А если не константный объект - по не константной ссылке.

В твоем примере нет возможности определить, является ли аргумент константным, или нет. В твоем примере в принципе нет возможности узнать, являлся ли объект константным или нет. Он априори считается константным
_Bers вне форума Ответить с цитированием
Старый 04.08.2012, 15:04   #20
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
waleri, если в функцию был передан константный объект - он должен быть принят по константной ссылке. А если не константный объект - по не константной ссылке.
Если передаваемый в функцию объект константен, то и ссылка константной будет.
Код:
template <typename T>
void modify (T &value) {
  value = 10;
}

int main () {
  int x = 10;
  const int y = 20;

  modify (x);
  modify (y); // Ошибка "нельзя модифицировать константный объект"
}
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация выигрышной стратегии для компьютера makc56 Паскаль, Turbo Pascal, PascalABC.NET 13 18.05.2012 13:32
движок для стратегии lamer69 Свободное общение 1 22.05.2011 01:16
Карта для стратегии sincemix Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 21.07.2010 23:54
Передача аргументов программе на Си, как реализовать? cympak Общие вопросы C/C++ 6 02.03.2010 19:49
Типы аргументов при перегрузке функций Arkuz Общие вопросы C/C++ 4 24.02.2009 01:16