LINUX.ORG.RU

Сообщения mathdev

 

передать владение unique_ptr указателю на потомка

Имеется типичная фабрика:

struct A;
struct B;
struct Base {
	int y;
	static std::unique_ptr<Base> create( size_t n );
    virtual ~Base() { }
};
struct A : public Base {int a; virtual ~A(){};};
struct B : public Base {int b; virtual ~B(){};};
std::unique_ptr<Base> Base::create( size_t n ){
  	if( n == 1 ) return  std::unique_ptr<Base>(new A );
     else  return  std::unique_ptr<Base>(new B );
}

При создании конкретного класса (A) потребовалось обратится к его уникальному полю (a). Решения этого вопроса удалось выполнить путем извлечения сырого указателя:

auto x = static_cast<A*>( Base::create(1).get() );
x->y=1;
x->a=2;

http://ideone.com/wGKclN

Но, что-то не нравиться мне такое решение, в дальнейшем с указателем x будут реализованы сложные алгоритмы. Переходить на shared_ptr тоже вроде смысла нет, т.к. создали один единственный указатель и с ним работаем.

Можно ли воспользоваться move? как то так

std::unique_ptr<A> z = std::move( x );
z->a=2;

 

mathdev
()

как заставить работать перегрузку функций?

void f(int x) { std::cout << x << " f\n"; }
void f(int x, int y) { std::cout << x << y << " g\n"; }

struct  A{
	int i;
	std::function<void(int)> f;
};

int main() {
	A a;
	a.i = 1;
	a.f = f;
	a.f(a.i);
	return 0;
}
prog.cpp: In function ‘int main()’:
prog.cpp:15:8: error: no match for ‘operator=’ (operand types are ‘std::function<void(int)>’ and ‘<unresolved overloaded function type>’)
  a.f = f;
        ^

 

mathdev
()

настроить std::cout

При вызове width() формат распространяется на следующее выводимое число

std::cout.width(20);
std::cout <<1.1 << ' ' << 2.2 << ' ' << 3.3  << std::endl; 
т.е. 20 позиций будет выделено под 1.1
                 1.1 2.2 3.3

Как распространить действие width на все N выводимых чисел, не перенабирая его N раз?

 

mathdev
()

export mylib из скрипта

при выполнении команды

$ cat myexport.sh
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH;../mylib/libfoo"
из скрипта LD_LIBRARY_PATH не устанавливается, но если эту команду выполнить из командной строки - то все ок.

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

 ,

mathdev
()

два потока наглядно

почему не наблюдается многопоточность?

$ cat async.cpp 
#include <iostream>
#include <future>
#include <chrono>
#include <thread>
 
using namespace std;

void fun1(){ for(int i=0; i<10; ++i){ this_thread::sleep_for(chrono::milliseconds(1000)); cout.put('+').flush();} }
void fun2(){ for(int i=0; i<10; ++i){ this_thread::sleep_for(chrono::milliseconds(1000)); cout.put('-').flush();} }

int main(){
    future<void> res1(async(fun1));
    fun2();
    res1.get();
}

$ g++-4.9 -std=c++11 async.cpp -lpthread && ./a.out 
----------++++++++++

 , ,

mathdev
()

поддержка OpenGL в Qt5

Помогите запустить простейшую Qt5 программу с поддержкой OpenGL (QGLWidget), все пакеты стандартные из Ubuntu 14.04.4 LTS.

Возникает ошибка, причину которой понять не могу:

$ qmake -project && qmake QT+=opengl && make && ./test
QXcbIntegration: Cannot create platform OpenGL context, neither GLX nor EGL are enabled

при этом

$ glxinfo | grep OpenGL
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Haswell Mobile 
OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.5.9
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 10.5.9
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:

 ,

mathdev
()

RSS подписка на новые темы