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 に答える