1


0

テンプレートの戻り値の型/テンプレートの関数としてのキャスト

私は壊れた多相性を持ついくつかの生成されたクラスで作業しています。 生成されたクラスTごとに、概念的にTにのみ関連するT_type_info、T_writer、T_readerクラスがいくつかあります。

私がやろうとしているのは次のようなものです:

template  class Wrapper
{
public:
   template  W topic_cast(BrokenBaseClassWriter* p);
   // other operations with the same problem ...
};

template <> class Wrapper
{
public:
    template <> MyTopicWriter* topic_cast(BrokenBaseClassWriter* p) { ... }
};

次のようなことができるように:

void Write(const Wrapper& topic)
{
    BrokenBaseClassWriter p = not_important;
    topic.topic_cast(p)->do_stuff();
}

TクラスはIDLから生成され、アプリケーション空間に存在する概念です。 それらは何にも由来しません。 上記の私の例では、Wは実際には独立したパラメーターではなく、「Tに依存するTではない何か」です。 Tのすべての知識をアプリに、T 'のすべての知識を(Tを知らなくても)バックエンドに保持しようとしています。

ただし、コンパイラは、topic_cast関数はテンプレート関数ではないと言っています。テンプレートは戻り値の型で発生し、他のインスタンス化と区別できないためだと思います。 (テンプレートは戻り値の型によってのみ異なる)は正当ではないことを知っています。 私の場合にのみ、Wは独立したパラメーターではないため、本当に一意になります。 しかし、コンパイラーと議論することはほとんど役に立ちません。

これを行うことはできますか、またはこれを「テンプレートタイプの関数としてキャストする」別の方法がありますか?

3 Answer


1


これは形質システムでは達成できませんか?

template  struct my_traits
{
};

template <> struct my_traits
{
  typedef MyWriter writer_type;
};

template  struct Wrapper
{
  typename my_traits::writer_type topic_cast();
};


0


これは機能しません:

topic.topic_cast(p)->do_stuff();

コンパイラが戻り値の型を推測できないためです。 +そのため、どの戻り値型をコンパイラーに明示的に指定する必要があります。

topic.topic_cast(p)->do_stuff();

指定する実装は、特定のタイプ用です。 +その特定のタイプを使用すると、そのコードが生成されます:

topic.topic_cast(p)->do_stuff();   // Use the explicit specialization


0


これはgccでコンパイルします:

class BrokenBaseClassWriter;
class MyTopic;
class MyTopicWriter;

template  class Wrapper
{
public:
   template  W *topic_cast(BrokenBaseClassWriter* p);
   // other operations with the same problem ...
};




template <> template<>
MyTopicWriter *Wrapper::topic_cast(BrokenBaseClassWriter* p)
{
  return 0;
}


int main(int argc, int argv)
{
  BrokenBaseClassWriter* p = NULL;
  Wrapper caster;
  MyTopicWriter *casted = caster.topic_cast(p);
}

もちろん、メインコードでMyTopicWriterを公開しています…​