Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
1

Строка как аргумент шаблона

10.11.2015, 16:56. Показов 1789. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
здравствуйте, можно ли как-то передать char* в аргумент шаблона?
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
template<const char* str, size_t N>
struct str_holder {
     static const char symbol = *(str+N);
};
 
int main() {
     const char* str = "hello world";
     //дальше не прокатывает
     std::cout<<str_holder<str, 3>::symbol;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2015, 16:56
Ответы с готовыми решениями:

создать фунуцию в которой строка передаётся как аргумент и возвращает количество слов
создать фунуцию в которой строка передаётся как аргумент и возвращает количество слов

Функция, возвращает квадрат аргумента, если аргумент число; хвост списка, если аргумент список; иначе сам аргумент
Помогите, пожалуйста, с заданием: Написать функцию, которая возвращает квадрат аргумента, если...

Что означает строка и где берется аргумент, указанный в кавычках
Использую код, по которому пытаюсь получить доступ к данным страницы интернет Dim URL As String...

Не переносится строка при формировании документа из шаблона Word
Доброго времени суток. Вот кусочек сформированного документа А вот так он выглядит в шаблоне ...

17
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.11.2015, 17:13 2
Можно попробовать...
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
template <const char * p, size_t index>
struct S { static constexpr char c = p[index]; };
 
constexpr const char p[] = "Hello";
 
int main() {
    S <p, 1> s;
    std::cout << s.c << std::endl;
}
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.11.2015, 17:21  [ТС] 3
vs2013 походу напрочь constexpr не поддерживает... есть ли более "классический" способ?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
10.11.2015, 17:26 4
Цитата Сообщение от tapochka Посмотреть сообщение
есть ли более "классический" способ?
не заниматься фигней?! Зачем использовать велосипед. Используйте обычные методы, зачем шаблонность в такой тривиальной ситуации (жду куллстори).
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.11.2015, 17:30  [ТС] 5
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
жду куллстори
решил сделать crc32 во время компиляции) таблица генерируется на 256 значений, а дальше ступор небольшой
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.11.2015, 17:33 6
tapochka, почитай тут.
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.11.2015, 17:36  [ТС] 7
castaway, видел, однако constexpr не поддерживаются у меня... ну и так чисто решил мозг прокачать, таблицу тоже во время компиляции сделать, и на шаблонах все... но походу не доделаю никогда
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.11.2015, 17:46 8
Цитата Сообщение от tapochka Посмотреть сообщение
castaway, видел, однако constexpr не поддерживаются у меня...
VS2013 разве не поддерживает C++11? Может его нужно просто включить?
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.11.2015, 17:50  [ТС] 9
C++
1
2
3
4
template<std::uint32_t N>
constexpr std::uint32_t crc32(const char(&s)[N], std::uint32_t i=0, std::uint32_t h=0xFFFFFFFF) {
   return (i==N-1)?h^0xFFFFFFFF:crc32(s, i+1, (h>>8)^crc32_table[(h^(std::uint8_t)s[i])&0xFF]);
}
имхо нельзя это сделать на шаблонах без constexpr... а говорят еще, что шаблоны тьюринг-полны...

Добавлено через 50 секунд
Цитата Сообщение от castaway Посмотреть сообщение
VS2013 разве не поддерживает C++11? Может его нужно просто включить?
все работает кроме constexpr. да и у меня чисто спортивный интерес был на шаблонах сделать все
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
10.11.2015, 19:26 10
Цитата Сообщение от tapochka Посмотреть сообщение
имхо нельзя это сделать на шаблонах без constexpr...
Можно, но несколько страшновато.
Смотри boost::mpl::string для примера. Это решение вообще без С++11.

Цитата Сообщение от tapochka Посмотреть сообщение
а говорят еще, что шаблоны тьюринг-полны...
Полнота по Тьюрингу - это вообще-то слегка про другое

Цитата Сообщение от tapochka Посмотреть сообщение
все работает кроме constexpr.
Да 2013 студия не поддерживает constexpr.
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.11.2015, 19:31 11
Цитата Сообщение от tapochka Посмотреть сообщение
все работает кроме constexpr.
Почему бы тебе не обновить VS?
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.11.2015, 19:42  [ТС] 12
Цитата Сообщение от DrOffset Посмотреть сообщение
Смотри boost::mpl::string для примера. Это решение вообще без С++11.
вот это огонь... там есть кусок:
C++
1
2
3
4
typedef mpl::size_t<  
    Seed::value ^ (static_cast<std::size_t>(Value::value)  
      + 0x9e3779b9 + (Seed::value << 6) + (Seed::value >> 2))  
  > type;
а разве static_cast работает во время компиляции? о_О это не рантайм получается чтоли?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
10.11.2015, 19:44 13
Что касается С++11, то да, можно сделать целиком на шаблонах. constexpr нужен будет только в одном месте, чтобы заставить компилятор расценивать переменную, хранящую значение литерала, как единицу времени компиляции. Остальные преобразования с символами можно будет делать без constexpr используя только шаблоны.

Добавлено через 58 секунд
Цитата Сообщение от tapochka Посмотреть сообщение
а разве static_cast работает во время компиляции?
static_cast только на этапе компиляции и работает На то он и static.
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.11.2015, 19:52  [ТС] 14
Цитата Сообщение от DrOffset Посмотреть сообщение
constexpr нужен будет только в одном месте, чтобы заставить компилятор расценивать переменную, хранящую значение литерала, как единицу времени компиляции
что можно придумать чтобы обойти эту заразу? она портит всю малину
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
10.11.2015, 20:27 15
Лучший ответ Сообщение было отмечено tapochka как решение

Решение

Цитата Сообщение от tapochka Посмотреть сообщение
что можно придумать чтобы обойти эту заразу? она портит всю малину
Можно с помощью boost::preprocessor cгенерировать нечто такое:
C++
1
2
3
4
5
6
7
template <char ...Chars>
struct string {};
 
int main()
{
    using ct_test_str = string<"abc"[0], "abc"[1], "abc"[2], "abc"[3]>;
}
где
C++
1
string<"abc"[0], "abc"[1], "abc"[2], "abc"[3]>
- это результат разворота вот такого, например, макроса
C++
1
MAKE_CT_STRING("abc")
В итоге ты получишь тип string<'a', 'b', 'c', '\0'>, который уже можно курочить шаблонами как бог черепаху... :)

Добавлено через 11 минут
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/config/limits.hpp>
 
template <char ...Chars>
struct string {};
 
#define STRING_TO_CHARS_BY_ONE(Z, N, STR) \
        BOOST_PP_COMMA_IF(N) N >= sizeof(STR) ? '\0' : STR[N]
 
#define STRING_TO_CHARS(LEN, STR)  \
        BOOST_PP_REPEAT(LEN, STRING_TO_CHARS_BY_ONE, STR)
 
#define MAKE_CT_STRING(STR) string<STRING_TO_CHARS(100, STR)>
 
template <char ...ch>
void print(string<ch...>)
{
    std::cout << __FUNCSIG__ << std::endl;
}
 
int main()
{
    using ct_test_str = MAKE_CT_STRING("abc");
    print(ct_test_str()); // для теста
}

http://rextester.com/VRXPYB26828
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.11.2015, 21:29  [ТС] 16
DrOffset, спасибо за ответ. попробую обходить символы входного литерала как-то так:
C++
1
2
3
4
typedef boost::mpl::string< 'Hell', 'o Wo', 'rld!'> helloworld;
 
//это еще нужно будет рекурсивно сделать...
std::cout<< boost::mpl::string_iterator<helloworld, 0, 2>::type::value << std::endl;
з.ы. не знаете какой максимальной длины можно запихнуть строку в mpl::string ?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
10.11.2015, 21:49 17
Цитата Сообщение от tapochka Посмотреть сообщение
не знаете какой максимальной длины можно запихнуть строку в mpl::string ?
См. тут: http://www.boost.org/doc/libs/... -size.html
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
11.11.2015, 19:57  [ТС] 18
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно с помощью boost:: preprocessor cгенерировать нечто такое
DrOffset, хм, а я даже сразу и не понял, что вы мне почти что подноготную mpl::string написали...
0
11.11.2015, 19:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2015, 19:57
Помогаю со студенческими работами здесь

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

Для использование шаблона переменной требуется список аргументов шаблона
Здравствуйте! Не могу понять в чём проблема. //ALL2.cpp #include &quot;pch.h&quot; #include &lt;iostream&gt;...

Указатель на имя файла как аргумент функции. Как реализовать?
Доброго времени суток всем! Прошу помощи! Написал программу, есть пару моментов, сложных для меня. ...

Как ввести звездочку как аргумент командной строки?
Нужно написать польский калькулятор ( на вход подается выражение, записанное в обратной польской...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru