我已經編寫了一個函數來將函數應用於std::tuple
,如下所示(基於"unpacking" a tuple to call a matching function pointer)。 我擔心元組可能會被複制。我對移動語義的作用有一個非常基本的概念,並理解常見的字符串示例中的概念,如& &和右值。但我不太瞭解std :: forward()和類似的工作方式。如果還有包裝和可變編程,我不知道如何處理它。 (我添加了幾個std :: forward和& &的周圍,很快就會出現編譯錯誤。)如何確保std :: tuple使用C++ 11在以下代碼中移動語義
有人可以請解釋如何使元組的移動語義工作在這裏嗎?另外一個問題是,我如何驗證(除了對代碼的視覺檢查)移動語義確實對代碼中的元組有效?
在此先感謝。
#include <tuple>
#include <iostream>
#include <functional>
template<int ...> struct seq {};
template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};
template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };
template <typename R, typename Tp, typename ...FArgs>
struct t_app_aux {
template<int ...S>
R static callFunc(std::function<R (FArgs...)> f,Tp t,seq<S...>) {
return f(std::get<S>(t) ...);
}
};
template <typename R, typename Tp, typename ...FArgs>
R t_app(std::function<R (FArgs...)> f, Tp t) {
static_assert(std::tuple_size<Tp>::value == sizeof...(FArgs), "type error: t_app wrong arity");
return t_app_aux<R, Tp, FArgs...>::callFunc(f,t,typename gens<sizeof...(FArgs)>::type());
}
int main(void)
{
std::tuple<int, float, double> t = std::make_tuple(1, 1.2, 5);
std::function<double (int,float,double)> foo1 = [](int x, float y, double z) {
return x + y + z;
};
std::cout << t_app(foo1,t) << std::endl;
}
你是否知道當你使用沒有資源的基本類型(即ints,double,std :: array等)時,move是否等於copy?所以在這個特定的代碼片段中不會有任何動作。 – Mikhail