Использование C ++ 11 AUTO в качестве типа возврата для объекта функции Const
-
20-12-2019 - |
Вопрос
У меня есть объект функции const и для портации, он возвращает void.Но можете вернуть int или двойной.Я пишу код в стиле C ++ 11 и просто пытался использовать Auto в качестве типа возврата.Хотя код компилирует, я не уверен, что это на 100% правильно или нет.Вот код.
template <typename graph_t>
struct my_func {
public:
my_func() { }
my_func (graph_t& _G) : G(_G) { }
template <typename edge_t>
auto operator()(edge_t edge) -> void const {
//do something with the edge.
} //operator
private:
graph_t& G;
};
//call the functor: (pass graph G as template parameter)
std::for_each(beginEdge, endEdge, my_func<Graph>(G));
.
Этот код компилируется и работает в последовательном режиме идеально.Теперь я пытаюсь распараллелизировать вышеупомянутое or for_each, используя Intel TBB Parallel_For_each ().Это требует, чтобы объект функции быть постоянным.Это означает, что нитки не должны быть разрешены для изменения или изменения частных переменных функциональных объектов.
//tbb::parallel_for_each
tbb::paralle_for_each(beginEdge, endEdge, my_func<Graph>(G));
Now, the compiler error comes:
passing const my_func< ... > .. discards qualifiers
.
Так что я должен был изменить оператор () () к следующему:
template <typename edge_t>
void operator()(edge_t edge) const {
// do something
} //operator
.
Мой вопрос: как использовать «Авто оператор () () -> void», а также сделать оператор «const», чтобы он был действительным?
Решение
Мой вопрос: как использовать «Авто оператор () () -> void», а также сделать оператор "const" так, чтобы оно становится действительным?
template <typename edge_t>
auto operator()(edge_t edge) const -> void
{
//do something with the edge.
}
.
Помните, что декларатор с CV-квалификатором имеет в основном следующую форму:
( Параметр-объявление-предложение-предложение ) cv-квалификатор-seq [ ref-квалификатор ] [< Спецификация исключения ] [
(опущены атрибуты)