[英]Issues in perfect forwarding C++
這個問題還在繼續提問 。 我不想弄亂這個問題,所以寫一個新問題。
在更改建議后,我再做了一次更改。 現在我創建了一個不可復制的類,並嘗試將同一個類傳遞給Print()
。
#include<utility>
#include<string>
#include<tuple>
#include<sstream>
template<typename... Args> struct Helper_Class
{
std::tuple<Args...> argTuple;
Helper_Class(Args&&... args):
argTuple(std::make_tuple(std::forward<Args>(args)...))
{}
};
template<typename... Args> std::ostream&
operator<< ( std::ostream& os,Helper_Class<Args...> obj)
{
return os;
}
struct A {
friend int main(int argc, char **argv);
friend std::ostream & operator<<(std::ostream &os, const A &a) {
return os << a.i;
}
A(int i_) : i(i_) {}
A(const A &) = delete;
A &operator=(const A &) = delete;
const int i;
};
template<typename...Args>
auto Print(Args&&... args)
{
return Helper_Class<typename std::decay<Args>::type...>(std::forward<Args>(args)...);
//return Helper_Class<typename std::decay<Args>::type...>(std::forward<Args>(args)...);
}
template <typename... Ts>
void test( Ts &&...params) {
std::stringstream s;
s <<Print(std::forward<Ts>(params)...);
}
int main(int argc, char **argv)
{
test(1,2,"foo", A(123));
}
但現在我收到鏈接器錯誤。 但是當我嘗試實現移動語義時,我不應該得到一個。
我得到的錯誤是:
/tmp/cckfv4uI.o: In function `std::_Head_base<3ul, A, false>::_Head_base<A>(A&&)':
forwarding.cpp:(.text._ZNSt10_Head_baseILm3E1ALb0EEC2IS0_EEOT_[_ZNSt10_Head_baseILm3E1ALb0EEC5IS0_EEOT_]+0x2a): undefined reference to `A::A(A const&)'
collect2: error: ld returned 1 exit status
由於您只需要一種方法來引用參數,因此您根本不需要完美的轉發。 這是一個例子:
#include<tuple>
#include<sstream>
template<typename Arg_Tuple> struct Helper_Class
{
Arg_Tuple argTuple;
Helper_Class(const Arg_Tuple &args): argTuple(args) {}
};
template<typename Arg_Tuple> std::ostream&
operator<< ( std::ostream& os,Helper_Class<Arg_Tuple> /*obj*/)
{
return os;
}
struct A {
friend int main();
friend std::ostream & operator<<(std::ostream &os, const A &a) {
return os << a.i;
}
A(int i_) : i(i_) {}
A(const A &) = delete;
A &operator=(const A &) = delete;
const int i;
};
template<typename...Args>
auto Print(const Args& ... args)
{
auto args_tuple = std::tie(args...);
return Helper_Class<decltype(args_tuple)>(args_tuple);
}
template <typename... Ts>
void test(const Ts &...params) {
std::stringstream s;
s <<Print(params...);
}
int main()
{
test(1,2,"foo", A(123));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.