gcc -c ../hello.c
создаст объектный файл hello.o
. Но вы используете дальше другое имя. Так что замените на gcc -c ../hello.c -o hello1.o
all: hpp
hpp: compile
gcc hello.o -o hpp
compile: ../hello.c
gcc -c ../hello.c
#include <iostream>
int main(int argc, char* argv[]) {
#pragma omp parallel for
for (size_t i = 0; i < 1000000; ++i)
{
std::cout << i << std::endl;
}
}
Вообще не нашел адекватной сборки.В этом и проблема. Вы ищите какие-то левые сборки с кряками, но на официальный сайт даже не удосужились зайти.
Компилятор не работает, отладка не работает, нихера не работает. Бомбит. А отзывы-то хорошие.Всё работает. Нужно не бомбить, а читать документацию.
Аналогично: компилятор не компилируется.Вы даже не понимаете, что должно происходить.
typeid
+ dynamic_cast
#include <iostream>
#include <vector>
#include <random>
#include <typeinfo>
using namespace std;
class Foo {
public:
virtual ~Foo(){}
};
class Bar: public Foo {
private:
size_t c;
static size_t n;
public:
Bar(): c(n++){};
virtual ~Bar(){};
size_t getC() const {return c;};
};
size_t Bar::n(0);
int main() {
std::mt19937 gen;
std::uniform_int_distribution<unsigned> dis(0, 2);
vector<Foo*> vec;
for(size_t i = 0; i < 100; ++i) {
if(dis(gen))
vec.push_back(new Foo);
else
vec.push_back(new Bar);
}
for(auto p: vec) {
if(typeid(*p) == typeid(Bar))
cout << dynamic_cast<Bar*>(p)->getC() << endl;
}
for(auto p: vec)
delete p;
return 0;
}
dynamic_cast
, но тогда придётся обрабатывать исключения. #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
и сразу подумал о свёртке. А в первый пример пришлось вчитываться. К тому же он ещё и не оптимальный - ведь деление можно вынести из цикла.