LINUX.ORG.RU

Сообщения Kuzy

 

i3, я хочу окошки при старте!

Есть ли нормальный способ заставить i3 открывать при старте приложения на конкретных воркспейсах?

Вот это не работает:

exec --no-startup-id i3-msg 'workspace 1; exec firefox'
exec --no-startup-id i3-msg 'workspace 3; exec i3-sensible-terminal'
exec --no-startup-id i3-msg 'workspace 3; exec i3-sensible-terminal'
exec --no-startup-id i3-msg 'workspace 1'

i3 version 4.11 (2015-09-30, branch "4.11") © 2009 Michael Stapelberg and contributors

Слипы не предлагать.

 

Kuzy ()

Предложение к модераторам

Меняю этот коммент: Предложение по стандарту C++ (комментарий)

На целую ветку комментов той же темы. Она там нужна.

Предложение ограничено: только для модераторов.

 

Kuzy ()

Emacs. face в точке

Вообщем, я очень эстет и мне сильно надоела белая полоска под номерами строк в emacs-e.

Я хочу поменять ее на серенькую!

Что бы узнать какой face под курсором, нужно нажать describe-face. Но курсор туда не хочет лезть!

Как поменять цвет этой полоски?
Как узнать как поменять цвет произвольного элемента?

Скрин: http://i.imgur.com/FNmLfqs.png

 ,

Kuzy ()

C++ каст при передаче по ссылке

Может ли компилятор (если очень захочет), кастовать к базовым классам при передаче по ссылке?

Вроде все работает, но вдруг здесь undefined behavior.

#include <iostream>

template <typename T>
class Base {
public:
	int getX() const {
		return static_cast<const T*>(this)->x;
	}
};

class Derived : public Base<Derived> {
public:
	int x = 5;
};


template <typename T>
void foo(const Base<T>& a) {
	std::cout << a.getX() << std::endl;
}

int main() {
	
	Derived a;
	foo(a); // выводит 5, это UB?
	
	Base<Derived> b;
	foo(b); // ожидаемо выводит мусор
	
	return 0;
}

 ,

Kuzy ()

Чистка анонимуса в development

Доколе?

Я видел очень много тредов в /development/, где анонимус писал много годных комментов, со ссылками и полезной информацией, после чего все эти комменты терли, поскольку были использованы ПЛОХИЕ СЛОВА. После этого тред превращался в кучу тупняка от регистрантов.

С этим точно не надо ничего делать? Точно-точно?

То, что смог вспомнить:
Ворос по раскрытию макросов
Шарп vs. Джава

Возможные решения:

  • Позволить модераторам, в рамках произвола, не удалять кажущиеся им (модераторам) полезными комментарии.
  • Редактировать удаляя матюки и срезая скор.
  • Редактировать, полностью убирая весь текст комментария оставляя заглушку вроде «УДАЛЕНО 5.1» (можно смотреть историю редактирования).
  • Предыдущий пункт, но на уровне движка форума.
  • Оставить все как есть.
  • ???

 

Kuzy ()

C++ сортировка произвольных типов.

Как сравнивать произвольные типы? Точнее мне нужно их сортировать, но для этого достаточно научиться их сравнивать.

У меня есть некий темплейт, который принимает произвольное количество классов (окей, я могу менять эти классы, но лучше этого не делать).

foo<C1, C2, C3>
foo<C8, C4>

Я хочу, чтобы foo<C1, C3, C5>::type и foo<C5, C1, C3>::type был один и тот же тип Boo<C1, C2, C5>, порядок не важен, главное, чтобы он был всегда одинаковый.

Единственное решение, которая я вижу - это нумеровать каждый класс. Как нумеровать автоматически, я не знаю.

class C1 {
  constexpr static int value = 1;
}
class C2 {
  constexpr static int value = 2;
}
...

type_info::before почему-то не constexpr.

 , ,

Kuzy ()

Статическая проверка статического интерфейса в статическом c++

Как статически проверить что у наследника есть нужная функция?

Пример:

template <typename Heir>
class SToString {
public:
	SToString () {
		// СТАТИЧЕСКАЯ ПРОВЕРКА
		std::string (Heir::* tmp)() = &Heir::toStringImpl;
	}

	std::string toString() {
		return static_cast<Heir*>(this)->toStringImpl();
	}
};

class Foo : public SToString<Foo> {
public:
	std::string toStringImpl() {
		return "Foo";
	}
};

Вот это вот работает, но только если в коде присутствует вызов конструктора Foo. И еще это костыль, который сыпет ворнинги.

Есть ли нормальное решение, например со static_assert-ом.

 ,

Kuzy ()

Это баг gcc или clang-а?

clang ест, ggc - нет.

template <typename... Args>
void g(Args... args) {
	g(args...);
}

template <typename... Args>
void fun2(Args... args) {
	[=] {
		fun2(args...); // error: parameter packs not expanded with '...':
		//   ^
	} ();
}

 ,

Kuzy ()

C++, темплейты, букварь

Как починить предпоследнюю строчку? Там где-то typename надо вставить, да?

template <int N>
struct int_ {
	static constexpr int value = N;
	using type = int_<N>;
};

template <typename T>
struct foo {
	template <int N>
	struct boo {
		using type = int_<N>;
	};
};

template <typename T>
auto fun (T a) {
	using type = foo<T>::boo<4>::type; // ошибка
}

 , , ,

Kuzy ()

Clang или GCC кто неправ?

#include <array>
#include <cmath>
#include <iostream>

using namespace std;

template <typename T, int Size>
class Vector {
public:
	Vector() = default;
	~Vector() = default;

	// gcc - срабатывает static_assert (которые перед main-ом)
	// clang - все нормально
//	template <typename... Args>
//	Vector(const Args... args)
//			: values { args... } {
//		static_assert(sizeof...(args) == Size, "Vector::Vector -- wrong number of arguments");
//	}

	// Оба компилятора считают это, хорошим, годным кодом.
	template<int S, typename... Args>
	Vector(const Vector<T, S>& vector, const Args... args) {
		static_assert((sizeof...(args) + S) == Size, "Vector::Vector -- wrong number of arguments");

		// Говнокод, но не суть
		const array<T, sizeof...(args)> tmp { args... };

		copy(vector.values.begin(), vector.values.end(), values.begin());
		copy(tmp.begin(), tmp.end(), values.begin() + S);
	}

private:
	array<T, Size> values;
};

using Vector2f = Vector<float, 2>;
// вот этот
static_assert(is_pod<Vector2f>::value, "Vector<T, Size> should be a POD");

int main() {
	return 0;
}

Вопрос в том, чем этот конструктор такой особенный? Ну и что делать, да.

Вроде если класс удовлетворяет списку ниже, то он POD.

  • Has a trivial default constructor. This may use the default constructor syntax (SomeConstructor() = default;).
  • Has trivial copy and move constructors, which may use the default syntax.
  • Has trivial copy and move assignment operators, which may use the default syntax.
  • Has a trivial destructor, which must not be virtual.
  • It has no virtual functions
  • It has no virtual base classes
  • All its non-static data members have the same access control (public, private, protected)
  • All its non-static data members, including any in its base classes, are in the same one class in the hierarchy
  • The above rules also apply to all the base classes and to all non-static data members in the class hierarchy
  • It has no base classes of the same type as the first defined non-static data member

То есть gcc-ня приняла этот конструктор за конструктор копирования/перемещения?

gcc 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
clang 3.4-1ubuntu3

 , , ,

Kuzy ()

Доступ к lambda capture

Вообщем, есть какой-то такой код:

int main() {
	Cell<int> a = 5;
	Cell<float> b = 2.3;
	
	Cell<double> c = { { &a, &b }, [=, &a, &b] { return a + b; } };

	return 0;
}

Проблема в том, что дублируется одна и та же чушь два раза (&a, &b). Ну это ладно, хуже то, что компилятор молчит если забыть добавить в список переменную, но оставить ее в лямбде. Вопрос в том, как вытащить из лямбды переменные которые она захватила, это возможно?

 ,

Kuzy ()

Раскрыть parameter pack в конструкторе

Как раскрыть parameter pack в statement-ы, без специализации (в конструкторе, например)?

class A {
public:
	template <typename... Args>
	A(Args&... args) {
		(args.value = 3)...; // ???
		// arg1.value = 3;
		// arg2.value = 3;
		// arg3.value = 3;
		// ...
	}
	
};

Придумал такое, но как-то уж слишком костыльно, даже для c++:

class A {
public:
	
	template <typename T>
	int set(T& x) {
		x.value = 3;
		return 0;
	}
	
	template <typename... Args>
	void foo(Args... args) {}
	
	template <typename... Args>
	A(Args&... args) {
		foo(set(args)...);
	}
	
};

 , ,

Kuzy ()

Помоги компилятору выбрать правильный вариант!

Можно как-то намекнуть компилятору, что нужно использовать вторую функцию если темплейтоаргумент указан?

#include <iostream>

using namespace std;

template <int Size, typename T>
int getArrayLength(T (&s)[Size]) {
	return Size;
}

template<int Size, typename T>
int getArrayLength(T* s) {
	return Size;
}

int main() {
	int a[100];
	int* b = new int[50];
	
	cout << getArrayLength(a) << endl; // 100 -- первая функция
	cout << getArrayLength<20>(a) << endl; // 20 -- вторая функция
	cout << getArrayLength<50>(b) << endl; // 50 -- вторая функция
	cout << getArrayLength<100>(a) << endl; // ошибка -- муки выбора
	
	return 0;
}

 , ,

Kuzy ()

C++ typedef variadic template

Удобно таскать с каждым темплейтоклассом типы с которыми он специализируется. Но с variadic template-ми что-то не выходит. ЧЯДНТ?

#include <iostream>
#include <functional>

using namespace std;

template <typename... Args>
class Func;

template <typename T, typename... Args>
class Func<T(Args...)> {
public:
	using RetT = T;
	using FunctionT = function<T(Args...)>;
	
	using ArgsT = Args; // <-- error
};

template <typename T>
class FuncBox {
public:
	typename T::FunctionT func;
	
	typename T::RetT call(typename T::ArgsT... args) {
		return func(args...);
	}
};

int main() {
	FuncBox<Func<int(float)>> w;
	
	w.func = [] (float x) -> int {
		cout << x << endl;
		return 4;
	};
	
	w.call(7);
	
	return 0;
}

 , ,

Kuzy ()

include в строку

Можно ли как-то, не особо костыльно, запихнуть файл в char[] во время компиляции?

const char[] str = TOSTRINGPLEASE(
#include "file"
);

 

Kuzy ()

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