1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lvan100-TmplArgs

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 2.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 24.11.2024 06:20 d3b82c0

Мы можем реализовать разные версии функций с одинаковым именем, используя перегрузку функций. Например:

int max(int a, int b) { return a>b?a:b; }
int max(int a, int b, int c)
{ return max(a,b)>max(b,c)?max(a,b):max(b,c); }

Мы также можем настроить функции для разных типов параметров, используя шаблоны функций. Например:

template<typename _T>
void debug(_T a, std::string b) { cout<<a<<b<<endl; }
template<typename _T, typename _T1>
void debug(_T a, _T1 b, std::string c) { cout<<a<<b<<c<<endl; }

Однако это правило не работает (по крайней мере, сейчас) для шаблонов классов. Например:

template<typename _T> struct Debug {
    _T _a;
    Debug(_T a) : _a(a) {}
    void debug(std::string s) { cout<<_a<<s; }
};
template<typename _T, typename _T1> struct Debug {
    _T _a;
    _T1 _b;
    Debug(_T a, _T1 b) : _a(a), _b(b) {}
    void debug(std::String s) { cout << _a << _b << s; }
};  

Приведённый выше код не соответствует правилам компилятора (VS2010). То есть мы не можем реализовать разные версии шаблонов классов с одинаковыми именами.

Есть ли способ преодолеть это ограничение? Да, мы можем использовать библиотеку TmplArgs, чтобы получить эту возможность.

Хотя использование TmplArgs стало проще, оно всё ещё не идеально:

  • Сначала нам нужно определить макросы для шаблона класса, например, в файле DebugBase.h.
  • Затем нам нужно создать общую форму шаблона класса, например, в файле Debug.h.
  • Наконец, нам нужно записать правила параметров в виде указателей на функции.

Вот пример использования TmplArgs для изменения шаблона Debug, приведённого выше:

Debug<void(int)> a;
a.debug(3,"0");
Debug<void(int,string)> b;
b.debug(3, "4", "0");

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/lvan100-TmplArgs.git
git@api.gitlife.ru:oschina-mirror/lvan100-TmplArgs.git
oschina-mirror
lvan100-TmplArgs
lvan100-TmplArgs
master