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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2012, 20:46   #1
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию Возможно ли реализовать стратегии оптимальных аргументов для функций?

Вопрос: как сделать так, что бы в зависимости от типа входящего аргумента, изменялся прототип принимающей его функции на оптимальный вариант?

Код:
template<class T>struct TOpt     { typedef T& Result; };
template<class T>struct TOpt<T&> { typedef T& Result; };
template<class T>struct TOpt<const T> { typedef const T& Result;  };
template<class T>struct TOpt<const T&>{ typedef const T& Result; };


template<class T>
void Foo( typename TOpt<T>::Result arg )
{

}

int main()
{
    int a=0;

    Foo(a);  //: error C2783: void Foo(TOpt<T>::Result): не удается составить аргумент шаблон для "T"

    return 0;
}
Задача - избежать конструкторов копий. Использование вида: Foo(a);

Делать явный инстанс вида Foo<int&>(a); нельзя.
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 20:49   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Сделать специализацию шаблона для всех примитивных типов (ибо их количество ограничено). Шаблон сам по себе унаследовать от другого шаблона, который и будет имплементацией
waleri вне форума Ответить с цитированием
Старый 03.08.2012, 20:55   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

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

Речь идет о генерации типов аргументов в прототипах функций, а зависимости от типа вошедших аргументов.
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 20:58   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

O, только сейчас заметил, что речь идет от функциях - тогда еще легче:

Код:
template <typename type>
void TImplement(type arg)
{
}

template <typename type>
void TFunction(const type& ref)
{
    TImplement(ref);
}

template <typename type>
void TFunction(type& ref)
{
    TImplement(ref);
}

void TFunction(int var)
{
    TImplement(var);
}
waleri вне форума Ответить с цитированием
Старый 03.08.2012, 21:04   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
O, только сейчас заметил, что речь идет от функциях - тогда еще легче:

Код:
template <typename type>
void TImplement(type arg)
{
}

template <typename type>
void TFunction(const type& ref)
{
    TImplement(ref);
}

template <typename type>
void TFunction(type& ref)
{
    TImplement(ref);
}

void TFunction(int var)
{
    TImplement(var);
}
Теперь все тоже самое, только функция принимает 10ть аргументов.
Любой из них может быть константным, или не константным объектом. Простым, или тяжелым.

Ещё раз: речь идет о генерации типа аргумента в прототипе функции, в зависимости от типа вошедшего аргумента.
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 21:08   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

А, все... нашел лекарство)
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 21:19   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну так покажите

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

template <typename t0, typename t1>
void TImplement(TArgument<t0> a0, TArgument<t1> a1)
{
}

template <typename t0, typename t1>
inline void TFunction(t0 a0, t1 a1)
{
    TImplement(TArgument<t0>(a0), TArgument<t1>(a1));
}
waleri вне форума Ответить с цитированием
Старый 03.08.2012, 21:24   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение

Код:
template <typename t0, typename t1>
inline void TFunction(t0 a0, t1 a1)
{
    TImplement(TArgument<t0>(a0), TArgument<t1>(a1));
}
Вы считаете, что таким образом можно избежать копирования тяжелых объектов?
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 21:26   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

[QUOTE=waleri;1082487]Ну так покажите

Способ не без изъяна..

Код:
struct SOpt
{
    template<class T>
    SOpt(T& a) { cout<< "SOpt(T& a)\n"; }

    template<class T>
    SOpt(const T& a) { cout<< "SOpt(const T& a)\n"; }
};


void Foo( SOpt arg )
{

}

using namespace Den;
int main()
{
    Foo(10);
    return 0;
}
Мне нужно сохранить информацию о типах.. А тут она теряется. Нужно что то другое
_Bers вне форума Ответить с цитированием
Старый 03.08.2012, 21:52   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну тогда так... добрый старый препроцессор:

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

template <typename type>
TArgument<const 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))

Последний раз редактировалось waleri; 03.08.2012 в 22:00.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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