
Assasin
06.06.2018
06:23:16
Где то статья новая вышла?

Ilia
06.06.2018
06:35:07
Парни, вопрос.
Почему codec-и задеприкейтили?
Чем не устраивали?

Anatoly
06.06.2018
06:55:16


Aleksandr
06.06.2018
10:02:46
привет. есть примерно такой код
#include <iostream>
#include <type_traits>
template <typename T>
struct Hold
{
Hold() = default;
Hold(const Hold & other) = default;
Hold(const T & value) : m_value(value)
{ std::cout << "ABC\n"; }
template <class U, class = typename std::enable_if<std::is_convertible<U, T>::value>::type>
explicit Hold(const U & other) : m_value(other)
{ std::cout << "DEF\n"; }
friend std::ostream & operator << (std::ostream & strm, const Hold & v)
{
return strm << v.m_value;
}
private:
T m_value;
};
using IntHold = Hold<int>;
void test(IntHold ih)
{
std::cout << ih << std::endl;
}
int main()
{
int i = 12;
test(i);
test(true);
test(123.4);
return 0;
}
в текущем варианте (и даже если убрать enable_if) всегда вызывается не-шаблонный конструктор. хочется, чтобы когда test вызывался именно от того типа, который держит Hold, вызывался не-explicit конструктор, но если вызывается не от того типа, то юзер явно должен сказать, что он понимает что делает и явно вызвал каст или сам сконструировал объект.
можно ли такого добиться не изменяя метод test()?

Google

Aleksandr
06.06.2018
10:03:58
аналоги метода test() раскиданы по всему коду, и хочется убедится, что никаких таких нежелательных кастов не происходит


Constantine
06.06.2018
10:07:11
привет. есть примерно такой код
#include <iostream>
#include <type_traits>
template <typename T>
struct Hold
{
Hold() = default;
Hold(const Hold & other) = default;
Hold(const T & value) : m_value(value)
{ std::cout << "ABC\n"; }
template <class U, class = typename std::enable_if<std::is_convertible<U, T>::value>::type>
explicit Hold(const U & other) : m_value(other)
{ std::cout << "DEF\n"; }
friend std::ostream & operator << (std::ostream & strm, const Hold & v)
{
return strm << v.m_value;
}
private:
T m_value;
};
using IntHold = Hold<int>;
void test(IntHold ih)
{
std::cout << ih << std::endl;
}
int main()
{
int i = 12;
test(i);
test(true);
test(123.4);
return 0;
}
в текущем варианте (и даже если убрать enable_if) всегда вызывается не-шаблонный конструктор. хочется, чтобы когда test вызывался именно от того типа, который держит Hold, вызывался не-explicit конструктор, но если вызывается не от того типа, то юзер явно должен сказать, что он понимает что делает и явно вызвал каст или сам сконструировал объект.
можно ли такого добиться не изменяя метод test()?
explicit не будет вызываться, синтаксис вызова тайпкаст
в данном случае речь идет о преобразовании типа, а не о явном вызове конструктора


Aleksandr
06.06.2018
10:09:12
почему такое происходит - понятно. вопрос - можно ли добиться желаемого поведения?

Spoonson
06.06.2018
10:09:46
можно попробовать на обычный конструктор повесить enable_if на is_same, но наверное есть получше методы

Constantine
06.06.2018
10:11:08
а, не сработает, понял

Aleksandr
06.06.2018
10:15:58
template <class U, class = void>
Hold(const U & other) = delete;
ну вообще, это более-менее решение, просто удалить все конструкторы от других типов. но хочется чтобы можно было писать так в случаях других типов:
test(HoldInt(true)) а не test(static_cast<int>( true) )
но если лучше не найдётся варианта, то вполне рабочий вариант, спасибо

Constantine
06.06.2018
10:18:10

Spoonson
06.06.2018
10:18:13

Aleksandr
06.06.2018
10:19:13
ладно, вообще бэкграунд вопроса убедиться, что нигде нежелательных кастов не происходит в коде. удаление от остальных типов её решает, спасибо ещё раз

Google

Constantine
06.06.2018
10:21:54
вообще прочитайте внимательно правила разрешения перегрузки, может быть там есть что-то что различит вызовы
вроде еще можно сделать
template <class U>
Hold(const U & other) : m_value(other)
и проверить, что либо U это точный тип, либо явный другой прокси тип

Spoonson
06.06.2018
10:24:25

Constantine
06.06.2018
10:27:19
можно просто int = 0

Spoonson
06.06.2018
10:28:11
возможно, можно как-нибудь вообще без него, но я не знаю как

Constantine
06.06.2018
10:28:29
я пробовал без него, это будут равнозначные перегрузки

Aleksandr
06.06.2018
10:28:42

Constantine
06.06.2018
10:29:19
тут проще
можно сказать is_convertible && !is_same

ed
06.06.2018
10:52:27
MS таки выкупил Github - уже обсуждали?

Дед Пегас
06.06.2018
10:56:43
Вот щас бы обсуждать это в плюсоконфе.

ed
06.06.2018
11:15:07
Ну и пожалуйста, ну и не нужно :<

Constantine
06.06.2018
11:20:25
го в холиварку

Alexander
06.06.2018
12:03:02

Юра Незнанов
06.06.2018
12:38:40
привет! Хелп! как в винде получить имя процесса. пид и хендлы достал, но имена функциями GetProcessImageFileName и QueryFullProcessImageName не у всех процессов достаются... Че делать?

ed
06.06.2018
12:40:02

Constantine
06.06.2018
12:40:31

Google

Юра Незнанов
06.06.2018
12:41:57
там корреляции с 32/64 нет?)
хз... там вот в чем трабла может быть: чтобы получить хендл по пиду нужно сделать OpenProcess(PROCESS_QUERY_INFORMATION...). У системных процессов эта функция не прокатывает (пишет что не хватает прав на использование PROCESS_QUERY_INFORMATION)

Denis
06.06.2018
14:33:59
Советую посмотреть исходники processhacker
https://processhacker.sourceforge.io
А как ты справился с проблемой получения хэндлов пайпов?

Alex Фэils?︙
06.06.2018
17:22:19

Sheldon
06.06.2018
19:05:45
где можно свои (опенсурс) конан-пекеджи хостить?

Grigor
06.06.2018
19:07:14
@zamazan4ik

Roman
06.06.2018
19:12:30
а конан это теперь некий условный стандарт? это удобно?

Никита
06.06.2018
19:21:08

Sheldon
06.06.2018
19:21:53
Разобрался, там для опенсурса "отдельная" регистрация https://bintray.com/signup/oss

FailsBot
06.06.2018
21:16:15
моя любимая методология программирования - "а давайте запихнем в приложение браузер и напишем все на js"

Vyacheslav
06.06.2018
21:22:07

Alex Фэils?︙
06.06.2018
21:23:48
Так автор цитаты раньше там работал

Vyacheslav
06.06.2018
21:29:23
Лол

Alexander
06.06.2018
22:45:29

Antony
07.06.2018
07:45:11
Приятно общаться с вежливыми людьми!
Ребята и девчёнки, а давайте его на С++ перетащим. К нам, в чатик :)

Alexander
07.06.2018
07:55:05

Antony
07.06.2018
07:55:40
Тут внезапно второй день обсуждения модулей намечается, вместо обсуждения constexpr контейнеров

Anatoly
07.06.2018
07:59:18

Google

Antony
07.06.2018
07:59:54

Anatoly
07.06.2018
08:00:41

Spoonson
07.06.2018
08:01:09
макросы то в итоге будут импортировать или нет?

Antony
07.06.2018
08:04:14

Spoonson
07.06.2018
08:04:50
какая интересная цифра вероятности

Alexander
07.06.2018
08:12:05

Spoonson
07.06.2018
08:13:49
да, из модулей - экспортировать