802 / 532 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
1

Как правильно перебросить аргументы в variadic template?

05.05.2017, 13:19. Показов 337. Ответов 11
Метки нет (Все метки)

всем привет, можете помочь пж, есть такая ф-ция:
C++
1
2
template<typename ... Args>
inline wstring WStrFormat(const wstring& format, Args ... args);
ей надо перебросить аргументы из этой функции(метода(к-тора)):
C++
1
2
template<typename ... Args>
CEsException(const wstring& format, Args ... args) : m_textError(WStrFormat(format, args...)) { }
как правильно это сделать, чтобы не побились спецификаторы/квалификаторы/типы и прочее у параметров?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2017, 13:19
Ответы с готовыми решениями:

Variadic template
Добрый день, господа. Будьте добры, помогите кто может. Есть у меня шаблонный класс ...

recursion with variadic template
#define NOT_COMPILE 1 #if NOT_COMPILE // так не компилится template &lt;class Type, unsigned...

Не работает variadic template
привет. код #include &lt;typeinfo&gt; #include &lt;iostream&gt; #include &lt;deque&gt; using namespace std; ...

Variadic template lambda capture
Доброго всем дня! Речь пойдёт об C++14, в котором стало возможным делать прямую передачу в...

11
Любитель чаепитий
3581 / 1682 / 518
Регистрация: 24.08.2014
Сообщений: 5,701
Записей в блоге: 1
05.05.2017, 13:26 2
а с чего они вообще должны биться при этом?

Добавлено через 1 минуту
а вообще советую в WStrFormat принимать rvalue ссылку на Args и отправлять туда тогда через std::forward, потому как данные в конструктор CEsExpetion копируются.
1
802 / 532 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
05.05.2017, 13:27  [ТС] 3
GbaLog-, не знаю, читал просто об этом гдет (чето там про std::forward или около того), я не особо силен в шаблонах.
Тогда все ли верно написано в этом коде?
C++
1
m_textError(WStrFormat(format, args...))
0
шКодер самоучка
2143 / 1855 / 906
Регистрация: 09.10.2013
Сообщений: 4,051
Записей в блоге: 7
05.05.2017, 13:27 4
Ferrari F1, std::forward
C++
1
2
3
4
5
template<class T, class... U>
std::unique_ptr<T> make_unique(U&&... u)
{
    return std::unique_ptr<T>(new T(std::forward<U>(u)...));
}
0
Любитель чаепитий
3581 / 1682 / 518
Регистрация: 24.08.2014
Сообщений: 5,701
Записей в блоге: 1
05.05.2017, 13:33 5
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Тогда все ли верно написано в этом коде?
да, вполне.
только советую всё же вот так изменить:
C++
1
2
template<typename ... Args>
inline wstring WStrFormat(const wstring& format, Args &&... args);
C++
1
2
template<typename ... Args>
CEsException(const wstring& format, Args &&... args) : m_textError(WStrFormat(format, std::forward<Args>(args)...)) { }
хотя подходит тебе это или нет не знаю, смотри там уже сам.
1
802 / 532 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
05.05.2017, 13:37  [ТС] 6
GbaLog-, ну вот WStrFormat такой, по сути просто переброс этих аргументов в swprintf происходит, аргументы в основном встроенных типов
C++
1
2
3
4
5
6
7
8
template<typename ... Args>
inline wstring WStrFormat(const wstring& format, Args ... args)
{
    size_t size = swprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
    unique_ptr<wchar_t[]> buf(new wchar_t[size]);
    swprintf(buf.get(), size, format.c_str(), args ...);
    return wstring(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
}
0
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
05.05.2017, 13:46 7
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
как правильно это сделать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <utility>
 
template <typename Arg, typename... Args>
void Foo(Arg&& arg, Args&&... args)
{
    std::cout << std::forward<Arg>(arg);
    using dummy = int[];
    (void)dummy{0, ((std::cout << ", " << std::forward<Args>(args)), 0)...};
}
 
template <typename Arg, typename... Args>
void Bar(Arg&& arg, Args&&... args)
{
    Foo(std::forward<Arg>(arg), std::forward<Args>(args)...);
}
 
int main()
{
    Bar(42, "Hello", 1.5);
}
Добавлено через 47 секунд
С fold expression всё ещё проще.
0
802 / 532 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
05.05.2017, 13:47  [ТС] 8
в вызове swprintf тоже лучше std::forward использовать?

Добавлено через 46 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
С fold expression всё ещё проще.
MrGluck, нее, не получится, обкатываем только с++11 стандарт на работе))
0
Любитель чаепитий
3581 / 1682 / 518
Регистрация: 24.08.2014
Сообщений: 5,701
Записей в блоге: 1
05.05.2017, 13:50 9
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
в swprintf тоже лучше std::forward использовать?
без разницы.
он же принимает эллипсис.

Добавлено через 21 секунду
хотя может и есть разница, я эллипсис один раз использовал, да и то в приколе.
0
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
05.05.2017, 14:06 10
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
в вызове swprintf тоже лучше std::forward использовать?
Там есть свой вариант printf для работы с variadic list (va_list).
Посмотрите vsprintf_s/vswprintf_s.
0
802 / 532 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
05.05.2017, 14:11  [ТС] 11
Цитата Сообщение от MrGluck Посмотреть сообщение
Посмотрите vsprintf_s/vswprintf_s.
не получится о5 же, мы сейчас в проекте наоборот от всего виндового пытаемся избавиться в рамках перевода проекта на кроссплатформенность
от ATL, COM, WIN API
0
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
05.05.2017, 14:38 12
Накатал немного кода на С++17 (хотелось поиграться )
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
29
30
31
32
33
34
#include <iostream>
#include <sstream>
#include <utility>
 
struct BufLoger
{
    ~BufLoger() { std::cout << ss.rdbuf(); }
    std::stringstream ss;
};
 
template <typename T>
BufLoger& operator << (BufLoger &out, T &&x)
{
    out.ss << std::forward<T>(x) << " ";
    return out;
}
 
template <typename... Args>
void Foo(Args&&... args)
{
    BufLoger b;
    (b << ... << std::forward<Args>(args));
}
 
template <typename... Args>
void Bar(Args&&... args)
{
    Foo(std::forward<Args>(args)...);
}
 
int main()
{
    Bar(42, "Hello", 1.5);
}
http://coliru.stacked-crooked.... b39f52452c
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2017, 14:38

Своеобразное раскрытие аргументов variadic template
Товарищи. Как бы сделать так, чтобы variadic раскрылся в нечто такое: template &lt;typename ......

Перенаправление указателя при перегрузке оператора в variadic template
Есть вот такой вот код (сделан в vs2014): #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Variadic Templates - как обращаться к аргументам variadic-функции?
Всем привет! Наверное, рано мне ещё с моими скудными знаниями в это лезть, но, изучив шаблоны и...

Как правильно передать аргументы в функцию?
Подскажите пожалуйста, как правильно сделать из этого функцию Node *p = new Node;...


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

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

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