我正在为类型为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)) {
}
}
答案 0 :(得分: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...>
完全相同的值,而不是所有的真实值。
答案 1 :(得分:0)
经过多次搜索,我发现了这一点:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
我可以使用pass-by-value更简单地获得相同的结果,而不是显式调用复制构造函数:
class wrapper_t {
private:
inner_t data;
public:
wrapper_t(inner_t c_data):
data(std::move(c_data)) {
}
}