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
да, из модулей - экспортировать