2012-03-22 4 views
1

からC++:私はきたなど、「INT」、「フロート」とは、例えば、私は、文字列の形でインスタンスに私のタイプを与えるレガシーインタフェースを持つ文字列

をパラメータ化指針を作成します問題を解決するために、これらの2つの機能を思い付いた:

template <typename T> 
T type_factory(const std::string& type_id) 
{ 
    if (!type_id.compare("long")) 
    { 
     long res; 
     return res; 
    } 

    if (!type_id.compare("double")) 
    { 
     double res; 
     return res; 
    } 

    if (!type_id.compare("char")) 
    { 
     char res; 
     return res; 
    } 
} 

template <class PointerClass, typename T> 
PointerClass<T>* pointer_factory(void* ptr, T dummy_type) 
{ 
    return static_cast<PointerClass<T>*>(ptr); 
} 

//Desidered usage: 
//void* raw_ptr; 
//Calculator<int>* p = pointer_factory<Calculator>(raw_ptr, type_factory("int")); 

第二の機能がエラーをコンパイルできないPointerClassの近くに「修飾されていないIDを期待」されます。

誰かが2番目の関数がコンパイルされず、それを修正する理由を教えてください。

ありがとうございます。 PointerClassは、テンプレートそのものであるため、代わりに

template <class PointerClass, typename T> 
PointerClass<T>* pointer_factory(void* ptr, T dummy_type) 

template < template<typename T> class PointerClass, typename T> 
PointerClass<T>* pointer_factory(void* ptr, T dummy_type) 

:テンプレートテンプレートを必要とするよう

+1

最初の機能が正しくありません。 'long'、' double'、 'char'のスーパータイプである' T'型はありません。 –

+0

まず、 'compare'は使わないでください。代わりに '=='を使用してください! –

+0

@ルーカマーティニ:そうです。それは素早くハックされ、その件名を突き止めることができましたが、タイプを指定しなければならないとかなり役に立たなくなります。 –

答えて

2

は思えます。

これはコンパイルエラーを修正します。あなたが望むものをテストする必要がありますが、私はそれは間違いです。

EDIT:

ではなく、テンプレートの、書き込み、この場合は他の人が理解しやすいかもしれないが、ファクトリクラスのように思えます。

+0

みんなありがとう、私はここで終わっていないが、私は達成したいことに少し近づいている:) –

関連する問題