-1

私はトリプル階層クラスを持っています:

template<class T> class Singleton;

class Base;

class Sub : public Base, public Singleton<Sub>;

基になる自動ポインターを使用しているため、Singleton はテンプレート クラスであり、Sub はそれ自体をテンプレート パラメーターとして渡します。私はシングルトンとベースを開発しており、パブリック API を使用すると、誰でも独自のサブクラスを追加できます。私は実際には、次のような実際のトリプル階層が必要です。

template<class T> class Singleton;

class Base : public Singleton<Base>;

class Sub : public Base;

外部の開発者がテンプレートや複雑さについて心配する必要がないように。これに関する問題は、Singleton での実装が、Sub のインスタンスを作成するたびに Base のコンストラクターを呼び出すようになったことです (テンプレート パラメーターが Base であるため)。

これがプリプロセッサ マクロで実行できるかどうか疑問に思っていました。

template<class T> class Singleton;

class Base : public Singleton<__CLASS_NAME__>;

class Sub : public Base;

__CLASS_NAME__プリプロセッサによって置き換えられるクラス名はどこにありますか。__PRETTY_FUNCTION__マクロは実際にクラス名を返すため、理論的にはこれが可能です。問題は、関数名を から削除するために文字列操作を行うことができないことです__PRETTY_FUNCTION__

サブクラスがクラスからの継承を認識しないように、これを達成する方法についてのアイデアはありSingleton<template>ますか?

4

2 に答える 2

8

そのため、外部の開発者はテンプレートや複雑さについて心配する必要がありません。

不可能。テンプレートパラメータをシングルトンに渡す要件を削除するようにベースとシングルトンを設計できる唯一の方法は、代わりにそれをベースに渡すことです。これは改善されません。

さらに、C++開発者がCRTPを使用できるようになることはかなり期待できます。

最後に、シングルトンは最も恐ろしい方法で吸います。正気を重んじるなら、すぐに取り除いてください。

于 2013-03-08T09:04:02.410 に答える
1

私は CRTP ( http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern ) にはあまり詳しくありませんが、Base 自体をテンプレートにするのはどうでしょうか?

template<class T> class Singleton;

template<class T> class Base : public Singleton<T>;

class Sub : public Base<Sub>;

于 2013-03-08T09:00:46.180 に答える