2016-10-27 3 views
1

У меня есть обычная функция process_letter_location(const char& c, string &word).C++: Использование циклов и переменных шаблонов (последовательность)

Внутри моей основной я объявил ряд строковых переменных, как так:

string sf_1 = "something", sf_2 = "something", sf_3 = "something", 
     sf_4 = "something"; 

И у меня есть string word и я называю свою обычную функцию, так

process_letter_location(word[0], sf_1); 
process_letter_location(word[1], sf_2); 
process_letter_location(word[2], sf_3); 
process_letter_location(word[3], sf_4); 

Это выглядит немного грязный, но я знаю, что могу использовать цикл для вызова подпрограммы, как

for(int i=0; i < 4; i++) { 
    process_letter_location (word[i], ?) 
} 

Но я «Я не очень уверен, как я собирался назначить второй аргумент. Переменные имеют «sf_» вместе, и единственное, что меняется, это числа. В любом случае, я могу включить этот обычный вызов в цикле? Если нет лучших способов реализации этого кода?

Любая помощь будет оценена по достоинству. Благодаря

+2

Не объявляйте, что должно быть массивом в виде отдельных переменных? – LogicStuff

+0

Замените 'string' на' const string & 'в объявлении/определении функции. Пожалуйста. – jimifiki

+0

'const char &' бесполезен. Копирование символа не является проблемой. – jimifiki

ответ

2

Вы можете использовать массив:

string sf[4] = { "something1", "something2", "something3", "something4"}; 

Затем цикл:

for(int i=0; i < 4; i++) { 
    process_letter_location (word[i], sf[i]); 
} 
+2

Пусть подсчет компилятора: 'string sf [4]' -> 'string sf []' –

+0

Также 'const string sf []', если вы не собираетесь менять строки. –

0

Вы можете начать с этого рефакторинга: заменить string с string * const в функции process_letter_location. (Отрегулируйте определение функции соответственно).

Затем вы можете заполнить свой любимый контейнер указателями строк и на нем наложить петлю.

Я думаю, что вы можете узнать много C++ из этого рефакторинга.

Позвольте мне показать, как вы могли бы написать цикл:

std::vector<std::string*> strings = {&sf_1, 
            &sf_2, 
            &sf_3, 
            &sf_4}; 

for(int i=0; i < 4; i++) { 
    process_letter_location (word[i], strings[i]); 
     } 

, то вы можете рассмотреть возможность использования итераторов, а не цикл C-стиле.

+0

Да, моя фактическая реализация имеет const и передает ссылки на нее. Я просто хотел сосредоточиться на переменной вещи :) – Prgrmrfx

+0

Извините, но * не * с 'const' и передать по ссылке - это отвлечение. Это заставляет нас останавливаться и идти «подождите, что? Почему это не так?». –

0

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

#include <iostream> 
#include <string> 
#include <type_traits> 
using namespace std; 

void process_letter_location(char c, string const& str) 
{ 
    cout << str << '\n'; 
} 

void process_strings(char* buf, string const& str) 
{ 
    process_letter_location(*buf, str); 
} 

template<typename... Args> 
auto process_strings(char* buf, string const& str, Args... args) 
    -> typename enable_if<sizeof...(Args)>::type 
{ 
    process_letter_location(*buf, str); 
    process_strings (++buf, args...); 
} 


int main() { 
    string sf_1 = "something1", 
      sf_2 = "something2", 
      sf_3 = "something3", 
      sf_4 = "something4"; 

    char buff[10]; 
    process_strings(buff, sf_1, sf_2, sf_3, sf_4); 
    return 0; 
} 

Это всего лишь причудливый способ развернуть цикл. See here

+0

1. Вам необходимо увеличить 'buf' в рекурсивном шаблоне. 2. Более простой способ увязать ограничения, которые у вас есть, будет: const string * sf [] = {& sf_1, & sf_2, ...}; а затем в цикле 'process_letter_location (buff [i], * sf [i]);' –

+0

@MartinBonner, 1) Я заметил и исправил это, когда вы печатали. 2) Как я уже сказал в первых двух предложениях, это излишне. Но это еще один способ сделать это. – StoryTeller

+0

О, ничего страшного. Я никогда не знал об этом методе. Посмотрим в него спасибо :) – Prgrmrfx

Смежные вопросы