Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449

Тип аргумента template<typename .Args>

24.04.2017, 12:03. Показов 4567. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно выполнить определенный код при определенном типе аргумента
Через шаблон или во время выполнения - не важно, хотя лучше так, как было бы быстрее(с точки зрения времени выполнения)

Пытаюсь так
C++
1
2
3
4
5
6
7
8
template<typename ...Args>
void Foo()(Args && ...args)
{
    using dummy = char[];
    (void)dummy
    {
        (std::is_same<Args, тут некоторый тип>() && (abort(), 0))...
    };
Но не срабатывает, хотя тип вписываю такой же, какой выдает
C++
1
typeid(Args).name()
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2017, 12:03
Ответы с готовыми решениями:

В чем различие template <typename T> от template <class T> ?
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

Template<typename T> vs auto
template &lt;typename T&gt; vector&lt;T&gt; my_vec1; vector&lt;auto&gt; my_vec2;Какая разница между содержимым vec1 и vec2?

Visual c++ шаблон template <typename TT>
пытаюсь разобраться с шаблонами, но выдает ошибку я даже не знаю куда смотреть https://github.com/Paladin3by/OOP template...

13
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.04.2017, 12:06
То есть функция должна проверять есть ли среди введённых параметров (кол-во произвольно) определённый тип?
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 12:12  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть функция должна проверять есть ли среди введённых параметров (кол-во произвольно) определённый тип?
Грубо говоря да, но если точнее, то должна еще с этим аргументом кое-что делать(в примере вместо abort() - была бы SomeAdjust(args))

Кстати, я немного дезинформировал - мой способ работает, но не для const char*
Если передавать int - все ок, а если, скажем, "test", то typeid выводит char const*, но способ не срабатывает ни для одной вариации типа
Как с этим быть?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
24.04.2017, 12:18
немного перемудрил, но работает.
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
//g++  5.4.0
 
#include <iostream>
 
namespace detail
{
 
    template<typename T, typename ... Args> struct CountOfImpl { enum { value = CountOfImpl<T, Args...>::value }; };
    
    template<typename T1, typename T2, typename ... Args> struct CountOfImpl<T1, T2, Args...> { enum { value = std::is_same<T1, T2>::value + CountOfImpl<T1, Args...>::value }; };
    
    template<typename T1, typename T2> struct CountOfImpl<T1, T2> { enum { value = std::is_same<T1, T2>::value }; };
 
} //namespace detail
 
template<typename T, typename ... Args>
constexpr size_t countOf(const T &, Args &&...)
{
    return detail::CountOfImpl<T, Args...>::value + 1;
}
 
int main()
{
    std::cout << countOf(1, 2, 3, 4u);
}
Добавлено через 53 секунды
что-то не то сделал я, похоже.
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 12:22  [ТС]
GbaLog-, да, это немного из другой оперы, но выглядит все равно интересно

Пользуясь случаем спрошу, может есть какой-нибудь более виртуозный способ объединить вывод char и wchar_t в w(какой-нибудь stream) без конвертации char в wchar_t на лету? Моего интереса к заданному вопросу, это, к слову, не отменяет =)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.04.2017, 12:51
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Пытаюсь так
http://rextester.com/FPD65995

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
#include <iostream>
#include <limits>
 
template<typename Banned, typename T>
void check(T&&)
{
    static_assert(
        !std::is_same<T,Banned>::value,
        "type of T was banned"
    );
}
 
 
 
template<typename Banned, typename ...Args>
void example(Args&& ...args)
{
    using dummy = char[];
    (void)dummy
    {
        (check<Banned>( std::forward<Args>(args) ), '\0' )...
    };
}
 
int main()
{
    //ok
    example<int>(true,true,'f'); 
    
    //error: static assertion failed: type of T was banned
    example<int>(1,true,'f'); 
}
Добавлено через 2 минуты
Цитата Сообщение от h3mbr0 Посмотреть сообщение
есть какой-нибудь более виртуозный способ объединить вывод char и wchar_t в w(какой-нибудь stream) без конвертации char в wchar_t на лету?
https://www.cyberforum.ru/cpp-... ost8787952
1
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 13:19  [ТС]
hoggy, так ведь у меня все по такому же принципу и работает
на примере вашего кода:
C++
1
example<???>("test");
Что тут должно быть?

За ссылку спасибо, посмотрю, но в моем случае, такой способ будет избыточный, наверное
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
24.04.2017, 13:37
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Что тут должно быть?
const char (&)[5]
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.04.2017, 13:40
Проблема в том, что "test" выводится как const char (&)[5]
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 13:40  [ТС]
GbaLog-, спасибо, конечно, но вопрос в том и заключался: как объединить (и можно ли вообще) все char независимо от размерности и типа ссылки? желательно еще независимо от const

MrGluck, действительно проблема =) так есть к ней решение?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.04.2017, 13:53
Лучший ответ Сообщение было отмечено h3mbr0 как решение

Решение

h3mbr0, это проблема именно char массивов (унаследованных от си).
Используйте std::string, Либо добавьте специализацию
C++
1
2
3
4
5
6
7
8
template<typename Banned, size_t size>
void check(const char (&)[size])
{
    static_assert(
        !std::is_convertible<const char (&)[size],Banned>::value,
        "type of T was banned"
    );
}
1
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 14:17  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
is_convertible
Так ведь это ровно то, что мне нужно! или где-то подвох?
C++
1
( std::is_convertible<Args, const char*>() && (func(), 0) )...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Foo(42);
int8_t sbytes[] { 42, 42 };
uint8_t ubytes[]{ 42, 42 };
Foo(sbytes);
Foo(ubytes);
Foo(L"test");
wchar_t *test = L"test";
Foo(test);
const char *test2 = "test";
Foo(test2); //func()
Foo("test"); //func()
char *test3 = (char*)test2;
Foo(test3); //func()
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.04.2017, 14:51
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Так ведь это ровно то, что мне нужно! или где-то подвох?
Если нужно проверить не передана ли в качестве одного из параметров сишная строка, то да.
Исходя из того, как вы в начале сформулировали задание, это было не ясно.
1
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 15:36  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Если нужно проверить не передана ли в качестве одного из параметров сишная строка, то да.
Исходя из того, как вы в начале сформулировали задание, это было не ясно.
Не просто сишная строка, а именно (const) char*
Я ведь несколько раз акцентировал внимание именно на этом, но соглашусь - с формулировками у меня некоторые проблемы =)
Задача решена, спасибо

Добавлено через 39 минут
Что ж, вдруг кому-нибудь понадобится
C++
1
2
3
4
5
6
7
8
9
template<typename ...Args>
void Foo(Args && ...args)
{
    using dummy = char[];
    (void)dummy
    {
        std::is_convertible<Args, const char*>() && (AddMbArg(args), 1) || (AddArg(args), 1)...
    };  
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2017, 15:36
Помогаю со студенческими работами здесь

Использование шаблонов при описании классов template<typename type>
mylist.h template&lt;typename T&gt; class MyList { public: MyList(); ~MyList(); void push_back(T data); // void...

Функция вычисления суммы элементов одномерного массива с помощью template<typename T>
Здравствуйте,помогите пожалуйста написать функцию вычисления суммы элементов одномерного массива с помощью template&lt;typename T&gt; я...

Что означает запись типа template<typename _Ty, size_t size> void foo(_Ty(&param)[size])?
Что означает такая запись(какой тип передается, что-то вроде ссылки на массив или что-нибудь ещё?): &lt;typename _Ty, size_t size&gt; ...

template, узнать тип переменной
template &lt;class RCIN&gt; RCIN cinn(void) { RCIN enter; if(RCIN == std::string) // Как узнать тип RCIN ?? getline(std::cin,...

Переделать код на шаблонный тип (template)
Пожалуйста переделайте код на шаблонный тип стека :( #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru