std :: initializer_list с помощью std :: thread - PullRequest
0 голосов
/ 10 апреля 2020
myNameSpace::functionName(this, {"abc", "abc1"});  // working fine

работает нормально, но

std::thread(myNameSpace::functionName<ClassName>(this, {"abc", "abc1"})); 
                     //error: invalid use of void expression.

Пожалуйста, подскажите, что мне здесь не хватает. или как это сделать.

namespace myNameSpace {
    template<typename T>
    void functionName(T* cm, std::initializer_list<std::string_view> args) { ... }
}

Ответы [ 3 ]

3 голосов
/ 10 апреля 2020

Во-первых, это не то, как вы запускаете поток. Вы вызываете его и передаете результат в качестве аргумента для запуска потока. Но void не является допустимым аргументом для запуска потока и не является каким-либо полезным выражением в каком-либо смысле.

Вместо этого вы бы написали что-то вроде этого:

std::thread(&myNameSpace::functionName<ClassName>, this, {"abc", "abc1"});

Ваша следующая проблема в том, что в языке нет возможности для компилятора определить, что вы подразумеваете под {"abc", "abc1"}. С прямым вызовом функции к functionName он может сработать, потому что механизм вызова функции знает, что представляют собой возможные перегрузки, но это не относится к этой «сломанной» конструкции.

Можно исправить это , указав тип:

std::thread(&myNameSpace::functionName<ClassName>, this, std::initializer_list<std::string_view>{"abc", "abc1"});

Однако я рекомендую просто передать (и принять) вместо std::vector<std::string_view>. Это будет намного проще и намного проще.

2 голосов
/ 10 апреля 2020

std::thread получает вызываемый в качестве первого параметра, вы отправили его void (результат вызова myNameSpace::functionName).

Вам нужно сделать

std::thread(myNameSpace::functionName<ClassName>, this, std::initializer_list<std::string_view>({"abc", "abc1"})));

Обратите внимание, что явное приведение к std::initializer_list является обязательным, поскольку std::initializer_list не является вычитаемым типом.

1 голос
/ 10 апреля 2020

Для потоков необходимо указать ссылку на функцию и параметры аргумента в списке аргументов, например:

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );

, в вашем случае вы должны указать аргументы следующим образом:

std::thread(myNameSpace::functionName<ClassName>,this, std::initializer_list<std::string_view>({"abc", "abc1"})); 
...