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

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

24.04.2017, 12:03. Просмотров 1948. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2017, 12:03
Ответы с готовыми решениями:

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

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

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

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

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

Кстати, я немного дезинформировал - мой способ работает, но не для const char*
Если передавать int - все ок, а если, скажем, "test", то typeid выводит char const*, но способ не срабатывает ни для одной вариации типа
Как с этим быть?
0
Любитель чаепитий
3499 / 1612 / 501
Регистрация: 24.08.2014
Сообщений: 5,529
Записей в блоге: 1
24.04.2017, 12:18 4
немного перемудрил, но работает.
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  [ТС] 5
GbaLog-, да, это немного из другой оперы, но выглядит все равно интересно

Пользуясь случаем спрошу, может есть какой-нибудь более виртуозный способ объединить вывод char и wchar_t в w(какой-нибудь stream) без конвертации char в wchar_t на лету? Моего интереса к заданному вопросу, это, к слову, не отменяет =)
0
Эксперт С++
8225 / 3813 / 826
Регистрация: 15.11.2014
Сообщений: 8,661
24.04.2017, 12:51 6
Цитата Сообщение от 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  [ТС] 7
hoggy, так ведь у меня все по такому же принципу и работает
на примере вашего кода:
C++
1
example<???>("test");
Что тут должно быть?

За ссылку спасибо, посмотрю, но в моем случае, такой способ будет избыточный, наверное
0
Любитель чаепитий
3499 / 1612 / 501
Регистрация: 24.08.2014
Сообщений: 5,529
Записей в блоге: 1
24.04.2017, 13:37 8
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Что тут должно быть?
const char (&)[5]
1
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
24.04.2017, 13:40 9
Проблема в том, что "test" выводится как const char (&)[5]
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 13:40  [ТС] 10
GbaLog-, спасибо, конечно, но вопрос в том и заключался: как объединить (и можно ли вообще) все char независимо от размерности и типа ссылки? желательно еще независимо от const

MrGluck, действительно проблема =) так есть к ней решение?
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
24.04.2017, 13:53 11
Лучший ответ Сообщение было отмечено 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  [ТС] 12
Цитата Сообщение от 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Эксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
24.04.2017, 14:51 13
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Так ведь это ровно то, что мне нужно! или где-то подвох?
Если нужно проверить не передана ли в качестве одного из параметров сишная строка, то да.
Исходя из того, как вы в начале сформулировали задание, это было не ясно.
1
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 15:36  [ТС] 14
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2017, 15:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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