辅助函数涉及std :: move

时间:2017-12-09 18:46:35

标签: c++ function c++11 templates perfect-forwarding

codereview不允许假设代码,所以我在这里发帖。鉴于此代码:

#include <string>

struct foo {
    std::string a, b;
    foo (const std::string& a, const std::string& b) : a(a), b(b) { }
};

template <typename T> void bar (const T&) { }
template <typename T> void bar (T&&) { }

void execute (const foo& f) {
    // etc...
    bar(f.a);
    // etc...
    bar(f.b);
    // etc...
    bar(f);
    // etc...
}

void execute (foo&& f) {
    // etc...
    bar(std::move(f.a));
    // etc...
    bar(std::move(f.b));
    // etc...
    bar(std::move(f));
    // etc...
}

int main() {}

我想写execute_helper来处理两个执行重载,因为除了std::move调用之外它们是相同的。这就是我所拥有的,我想知道我是否正确地做到了。我不确定在T&重载中使用Tcheck_move,以及按值T传递是否会加剧时间复杂性。

#include <string>
#include <iostream>

struct foo {
    std::string a, b;
    foo (const std::string& a, const std::string& b) : a(a), b(b) { }
};

template <typename T> void bar (const T&) { }
template <typename T> void bar (T&&) { }

template <typename T>
T check_move (const foo&, T& t) { std::cout << "std::move not called.\n";  return t; }

template <typename T>
T&& check_move (foo&&, T t) { std::cout << "std::move called.\n";  return std::move(t); }

template <typename F>
void execute_helper (F&& f) {
//   etc...
    bar(check_move(std::forward<F>(f), f.a));
//   etc...
    bar(check_move(std::forward<F>(f), f.b));
//   etc...
    bar(check_move(std::forward<F>(f), std::forward<F>(f)));
    // etc...   
}

void execute (const foo& f) {
    execute_helper(f);
}

void execute (foo&& f) {
    execute_helper(std::forward<foo>(f));
}

// Test
foo make_foo() {
    return foo("hello", "bye");
}

int main() {
    foo f("hello", "bye");
    execute(f);
    execute(make_foo());
}

输出:

std::move not called.
std::move not called.
std::move not called.
std::move called.
std::move called.
std::move called.

0 个答案:

没有答案