すべてのクラスとクラステンプレートを受け付けるCテンプレートを作成する方法

c++ overloading templates
すべてのクラスとクラステンプレートを受け付けるCテンプレートを作成する方法

注意してください:この質問はそれが実際よりもはるかに明白なようです。

テンプレートパラメータとして任意の具象クラスまたはテンプレートクラスを受け入れることができるテンプレートを書きたいのですが。 Tで渡されたものがテンプレート化されているかどうかを知らなければ、使い方がわからないので、これは無用に思えるかもしれません。 これが欲しいのは、一般的なテンプレートを定義せずに宣言できるようにするためです。その場合、ユーザーは専門にします。 ユーザーはそれを専門にしているので、彼らは常に彼らが扱っているタイプについて知っています。 しかし、ユーザーは最初に宣言されていないとテンプレートを特殊化することはできません。

あなたはこれをすることができます:

template
class myclass;

ただし、テンプレートTOを渡した場合は機能しません。たとえば、「+ my class」は機能しません。 それで、これを試します。

template
class myclass;

template T>
class myclass;

これは正しい道かもしれませんが、クラステンプレートが過負荷になることはないので、それはそれほどうまくいきません。 それでは、関数テンプレートに切り替えましょう。

template
void myfunc();

template T>
void myfunc();

スウィート、それで私たちは正しくやったの? テンプレートテンプレートのパラメータに与えられるパラメータの数が異なるかもしれないので、それも考慮する必要があります。

template
void myfunc();

template T>
void myfunc();

template T>
void myfunc();

template T>
void myfunc();

// etc.

醜い、しかしhttp://www.boost.org/doc/libs/1_39_0/libs/preprocessor/doc/index.html [Boost Preprocessor Library]はこのコードを生成することができます(そしてC言語では可変テンプレートのサポートはこの醜さが一時的なものにすぎないように追加してください。 しかし、我々はまだ事件を忘れています! Tのパラメータの1つがクラスではなく、定数の整数の場合 それをサポートしようとすることができます:

template
void myfunc();

template T>
void myfunc();

template T>
void myfunc();

template T>
void myfunc();

// etc.

template T>
void myfunc();

template T>
void myfunc();

template T>
void myfunc();

template T>
void myfunc();

template T>
void myfunc();

template T>
void myfunc();

// etc.

ええとああ。 クラスパラメータと組み合わせて、任意の定数型をテンプレートに渡すことができます(KABLOOY組み合わせ爆発)。 さらに困難にするために、Tのパラメータのいずれかがそれ自体テンプレートであるとしたらどうでしょうか。

  4  1


ベストアンサー

boost

mplはこのようなことをする(これは 引数を結び付けるという彼らの考えである)。 しかし、それをうまく機能させるには、次のように多くの前提条件があります。

template foo {}; typedef foo <int_ <4>> my_foo_4;

の代わりに

template foo {}; typedef foo <4> my_foo_4;

すべてのint、char、boolなどの組み合わせに対してオーバーロードを提供する必要はありません。

boost

mplアプローチよりも効果的なものは何も考えられないし、そして一般的に、私はどんなアプローチも多くの問題を被るだろうと思うだろう。クラステンプレートは型ではありませんし、そのように型システムに組み込むことはできません(boost :: mplは新しい型を作成するための関数として扱います。より一般的には “MetaFunction”を作成するために使用されます)。 。 可変テンプレートがテンプレートテンプレートのパラメータに影響を与えるかどうかさえわかりません(興味深い質問ですが)。

3


解決策は次のとおりです。テンプレートの特殊化ではなく、関数のオーバーロードを使用します。 コンパイル時間が良くなり、制約がなくなります。

テンプレートは、使用された後で最も近いグローバルスコープでインスタンス化されたと見なされることを忘れないでください。 これはこれがうまくいくことを意味します。

template
int f(const T& t)
{
  return g(t);
}

int g(int a)
{
  return a+1;
}

int main()
{
   return f(5);
}

ご覧のとおり、関数+ g が f +の後に定義されていても機能します。 つまり、テンプレートを使用する前にユーザーが関数を定義していれば、その関数を使用するテンプレートを自由に定義できます。Cがそれを検出します。

テンプレートの特殊化は関数には存在しないことも忘れないでください。 同じ名前の関数が多数存在する場合、Cはテンプレートの特殊化ではなく、常にオーバーロードを予想します。

手短に言うと、最善の解決策は、関数をそれが存在するかのように使用し、ユーザーがテンプレートを使用する前に関数を定義することを期待することです。

1


テンプレートクラスmyclass。

template <> class myclass {}; template <> class myclass> {}; template <> class myclass>> {};

これは、あなたの望むことですか?

0


タイトルとURLをコピーしました