Пользовательский крюк инициализатора не применен в Boost.processC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Пользовательский крюк инициализатора не применен в Boost.process

Сообщение Anonymous »

Мой пример кода является следующим. Это использует boost.process v2 < /p>

Код: Выделить всё

#include 
#include 
#include 

namespace sys = boost::system;
namespace v2 = boost::process::v2;
namespace fs = boost::filesystem;
namespace asio = boost::asio;

using launcher_type = v2::posix::default_launcher;
using pathname_type = fs::path;
using args_type = char* const*;

const fs::path null_cmd = v2::environment::find_executable("true");
std::initializer_list args{};

size_t last_local_event = 0;

struct hooks {
sys::error_code on_setup(launcher_type &, const pathname_type &, const args_type &) {
last_local_event = 1;
return sys::error_code{};
}
};

auto main() -> int {
asio::io_context context;
sys::error_code ec{};
launcher_type launch{};
hooks init{};

v2::process p = launch(
context, ec,
null_cmd,
args,
std::move(init)
);

context.run();
p.wait(ec);
assert(last_local_event == 1);

}
Пользовательский экземпляр on_setup в моих крючках . Boost Process Linux Launcher of This Typemer.
После взгляда на исходный код Boost.process, я считаю, что мой вызов on_setup следует заменить и вызвать во время запуска on_setup , как это было предоставлено с помощью инициализатора инициализатора , когда был вызван объект запуска процесса. Функция on_setup Соответствует функции, которая ожидается для on_setup с пользовательским инициализатором в процессе усиления на Linux. Подписи функций, по -видимому, соответствуют, и все же мой пользовательский инициализатор не используется для процесса. Вызов Assert вызов в моем примере кода. Значение fast_local_event не было изменено моей пользовательской функцией on_setup .
Есть ли здесь что -то, что мне не хватает, например, как применять шаблонные замены для пользовательского повышения. Был вызов из предоставленного init ? Компилятор может дать некоторую информацию о том, почему замена не работает?

Код: Выделить всё

using args_type = char* const*;
< /code>
, как используется в методе < /p>
sys::error_code on_setup(launcher_type &, const pathname_type &, const args_type &)
при использовании аналогичного кода (адаптированный после модульного тестирования в процессе Boost), но при специализировании on_setup , как таково, метод запуска on_setup on_setup :
struct hooks {
// [sic]

template
sys::error_code on_setup(L&, const pathname_type&, const char*const*&) {
event_flag = true;
return sys::error_code{};
}
};

Это также работает, хотя он может быть немного менее портативным, при определении on_setup крючком без шаблона для запуска Arg:

Код: Выделить всё

struct hooks {
// [sic]

sys::error_code on_setup(launcher_type&, const pathname_type&, const char*const*&) {
event_flag = true;
return sys::error_code{};
}
};
Тип Args для процесса Boost v2 на Posix-подобных платформах-char* const* . Это отличается от платформ Windows, которые использовали бы std :: wstring в качестве типа Args. Это было проверено как с помощью GCC, так и с Clang. Похоже, что const args_type & В объявлении метода обрабатывается как другой тип, чем const char*const*& ? class = "lang-cpp prettyprint-override">

Код: Выделить всё

using const_args_type = const char* const*;
Может ли кто -нибудь помочь выяснить, почему замена шаблона не удается, когда on_setup определяется с помощью const args_type & там? Может ли это быть что-то конкретное для типов массива C?


Подробнее здесь: https://stackoverflow.com/questions/796 ... st-process
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»