0

以前に他の人がこの設計の問題に遭遇したと思うので、誰かが私に何をすべきかについてアドバイスをくれることを願っています:私はプライベートジェネリックオブジェクトを保持することになっているクラスを持っています。私の知る限り、クラス全体をテンプレートにしないと逃げられません。大丈夫。しかし今、明示的に指定せずに、コンストラクターパラメーターから構築中に基になるオブジェクトのタイプを推測する方法はありますか(クラスDerivedをインスタンス化するときにテンプレートパラメーターを省略したい):Test

#include <iostream>

template <typename T>
class Generic
{
};

class Derived : public Generic<int>
{
public:
    Derived ();
    int GetFoo ();
private:
    int m_foo;
};

template <typename T>
class Test
{
public:
    Test (T &underlying);
private:
    T m_underlying;
};

Derived::Derived ()
{
    this->m_foo = 666;
}

int Derived::GetFoo ()
{
    return this->m_foo;
}

template<typename T>
Test<T>::Test (T &underlying) : m_underlying(underlying)
{
    std::cout << this->m_underlying.GetFoo() << std::endl;
}

int main ()
{
    Derived underlying;
    Test<Derived> test(underlying);

    return 0;
}

目標を達成するために知っておくべき他の設計戦略はありますか?

4

2 に答える 2

4

通常、クラステンプレートと型推定関数テンプレートがあります。

template <typename T>
struct Foo
{
    Foo(T const &);
};

template <typename T>
Foo<T> make_foo(T const & t)
{
    return Foo<T>(t);
}

使用法:

auto foo = make_foo(1728);   // makes a Foo<int>

make_pairこのアイデアは、標準ライブラリ( 、、make_tupleなど)で数え切れないほど使用されていmake_sharedます。指針となる原則は、希望するタイプ名を一度に言うべきであり、推測できる場合はまったく言わないことです。

于 2012-11-15T19:46:46.080 に答える
3

Testオブジェクトを作成する関数を作成するだけです。

template <typename T> 
Test<T> make_test(T& underlying)
{
    return Test<T>(underlying);
}

int main ()
{
    Derived underlying;
    auto test = make_test(underlying);

    return 0;
}
于 2012-11-15T19:47:18.887 に答える