简体   繁体   English

完美转发C ++的问题

[英]Issues in perfect forwarding C++

This question is in continuation to question . 这个问题还在继续提问 I didn't wanted to clutter that question and so writing a new question. 我不想弄乱这个问题,所以写一个新问题。

After the changes suggested I made one more change. 在更改建议后,我再做了一次更改。 Now I created one non-copyable class and tried passing same class to Print() . 现在我创建了一个不可复制的类,并尝试将同一个类传递给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));
}

But now I am getting linker error. 但现在我收到链接器错误。 But I should not get one as I am trying to implement move semantics. 但是当我尝试实现移动语义时,我不应该得到一个。

Error I am getting is: 我得到的错误是:

/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

Since you just need a way to refer to the arguments, you don't need perfect forwarding at all. 由于您只需要一种方法来引用参数,因此您根本不需要完美的转发。 Here's an example: 这是一个例子:

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM