Я хочу передать перегруженную функцию std::for_each()
алгоритм. Например,
class A {
void f(char c);
void f(int i);
void scan(const std::string& s) {
std::for_each(s.begin(), s.end(), f);
}
};
Я ожидал бы, что компилятор решит f()
типом итератора. По-видимому, это (GCC 4.1.2) не делает этого. Так, как я могу указать который f()
Я хочу?
Вы можете использовать static_cast<>()
, чтобы указать, какой f
использовать в соответствии с сигнатурой функции, подразумеваемой типом указателя функции:
// Uses the void f(char c); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(char)>(&f));
// Uses the void f(int i); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(&f));
Или можно поступить так:
// The compiler will figure out which f to use according to
// the function pointer declaration.
void (*fpc)(char) = &f;
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload
void (*fpi)(int) = &f;
std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
Если f
является функцией-членом, то нужно использовать mem_fun
, или для вашего случая использовать решение, представленное в этой статье Dr. Dobb's article.
Не отвечая на ваш вопрос, но я единственный, кто находит
for ( int i = 0; i < s.size(); i++ ) {
f( s[i] );
}
и проще, и короче, чем for_each
альтернативу, предложенную in silico в этом случае?