#include <iostream>
using namespace std;
unsigned power10(unsigned y) {
unsigned result = 1;
while(y--)
result = (result << 3) + (result << 1);
return result;
}
int sign(int a) {
if(a < 0)
return -1;
else
return 1;
}
void swap(int& a, int& b, unsigned k, unsigned l) {
const int multiply_a = power10(k);
const int multiply_b = power10(l);
const int digit_a = sign(a) * (a / multiply_a) % 10;
const int digit_b = sign(b) * (b / multiply_b) % 10;
const int add_a = multiply_a * digit_b - multiply_a * digit_a;
const int add_b = multiply_b * digit_a - multiply_b * digit_b;
a = a + sign(a)*add_a;
b = b + sign(b)*add_b;
}
int main() {
{
int a = 12345;
int b = 98765;
cout << a << ", " << b << " : ";
swap(a, b, 1, 4);
cout << a << ", " << b << endl;
}
{
int a = -12345;
int b = 98765;
cout << a << ", " << b << " : ";
swap(a, b, 1, 4);
cout << a << ", " << b << endl;
}
{
int a = -12345;
int b = -98765;
cout << a << ", " << b << " : ";
swap(a, b, 1, 4);
cout << a << ", " << b << endl;
}
return 0;
}
std::bind
для каррирования вашего метода. Нестатический метод обязательно принимает неявно первым параметром указатель на объект, у которого он вызывается. Тот самый this. Т.е. метод без параметров на самом деле является функцией с 1 параметром. Вот этот параметр и нужно зафиксировать, превратив метод в настоящую функцию без параметров.#include <functional>
#include <iostream>
#include <string>
#include <map>
class Foo {
public:
Foo(std::string msg): m_msg(msg) {}
void event() {
std::cout << m_msg << std::endl;
}
private:
std::string m_msg;
};
int main() {
auto foo = new Foo("Foo");
auto bar = new Foo("Bar");
std::map<std::string, std::function<void ()>> keyEvents = {
{"foo", std::bind(&Foo::event, foo)},
{"bar", std::bind(&Foo::event, bar)}
};
for(auto callback: keyEvents) {
std::cout << callback.first << ":";
callback.second();
}
keyEvents.clear();
delete foo;
delete bar;
return 0;
}
но меня смущает вызов 2 дополнительных функций в шаблоне
accumulate
и сразу подумал о свёртке. А в первый пример пришлось вчитываться. К тому же он ещё и не оптимальный - ведь деление можно вынести из цикла.#include <boost/format.hpp>
#include <iostream>
int main() {
std::string val = "hello world";
boost::format f("[%s : %i]");
int p = 100500;
std::cout << boost::str(f % val % p) << std::endl;
std::cout << boost::str(f % val % (p - 1)) << std::endl; //Can be reused
std::cout << boost::str(boost::format("Hello, %s!") % "@Taraflex") << std::endl; //Can be initialized in place
return 0;
}
Eclipse C/C++ не подходит - он не подсвечивается C/C++ синтаксисЧто я делаю не так?
// здесь что-то заполняется эту строку
sval