0

我正在为 inner_t 类型的类编写一个包装类。我可以通过以下方式为内部类调用正确的构造函数(左值引用或右值引用)吗?

template<typename S, typename T>
struct u_ref {
};

template<typename S>
struct u_ref<S, const S&> {
    typedef const S& type;
};

template<typename S>
struct u_ref<S, S&&> {
    typedef S&& type;
};

class wrapper_t {
private:
    inner_t data;
public:
    template<typename T>
    wrapper_t(typename u_ref<inner_t,T>::type c_data):
        data(std::forward(c_data)) {
    }
}
4

2 回答 2

2

标准的成语是这样的:

宝贝的第一个模板:

#include <utility>

struct Foo
{
    Inner child;

    template <typename ...Args>
    Foo(Args &&... args) : child(std::forward<Args>(args)...) { }

    // ...
};

成人版:上面的问题是它可以Foo任何不干净的东西中构造出来。我们必须禁用没有意义的重载。

#include <type_traits>
#include <utility>

struct Foo
{
    Inner child;

    template <typename ...Args,
              typename = typename std::enable_if<std::is_constructible<Inner, Args...>::value>::type>
    Foo(Args &&... args) : child(std::forward<Args>(args)...) { }

    // ...
};

通过这种方式,特征std::is_constructible<Foo, Args...>将具有与 完全相同的值std::constructible<Inner, Args...>,而不是对所有内容都为真。

于 2013-12-31T00:36:47.443 回答
0

经过大量搜索,我发现了这个:http ://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

与其显式调用复制构造函数,我可以更简单地使用按值传递来获得相同的结果:

class wrapper_t {
private:
    inner_t data;
public:
    wrapper_t(inner_t c_data):
        data(std::move(c_data)) {
    }
}
于 2013-12-31T01:42:34.257 回答