テンプレートクラスには、インスタンス化ごとに複製されたすべての静的メンバーがあります。すべてのインスタンスに対して1回だけ存在する静的メンバーが必要な場合は、どうすればよいですか?クラステンプレートの外部で通常の静的フィールドを使用しますか?動作しますが、テンプレートクラスへの関連付けがなくなったため、不正なようです。そのような一意の静的メンバーをテンプレートクラスに関連付ける方法はありますか?
6 に答える
いいえ; 各テンプレートクラスは完全に別個のオブジェクトです。
できることは、静的メンバーを使用して共通の祖先クラスを作成することです。
class Parent
{
public:
static int commonStatic;
};
template <typename T>
class MyTempl : public Parent
{
static int nonSharedStatic;
};
テンプレートクラスには、インスタンス化ごとに複製されたすべての静的メンバーがあります。
いいえ。スペシャライゼーションごとに異なる統計がありますが、スペシャライゼーションが異なればクラスも異なります。それについては間違いなく、vector<int>
完全に分離されています。書くことと考えてください。vector<char>
IntVector
CharVector
編集:これには継承を使用しないでください。静的メンバーを共有できるようにするためだけに基本クラスを導入することは、間違いなく間違った方法です。
異なるクラス間で共有したい場合は、通常どおりに行ってください。いくつかの静力学を3番目のクラスでラップします。それだけです。
テンプレートクラスの基本クラスを定義します。この基本クラスにすべての一般的なメンバーを含めます。
class ExampleBase {
public:
static int foo;
};
int ExampleBase::foo = 0;
template <class A>
class Example : private ExampleBase {
public:
static void setFoo(int f) { foo = f; }
static int getFoo() { return foo; }
};
次に、各サンプルインスタンスには共通の静的メンバーがありますExampleBase::foo
。
int main() {
Example<int>::setFoo(7);
assert(Example<float>::getFoo() == 7);
};
グローバル変数をどこかに置きます。
このようなもの :
#include <iostream>
// header.hpp
extern int someValue;
template< typename T >
struct A
{
int foo() const
{
return someValue;
}
};
// source.cpp
int someValue = 5;
int main()
{
std::cout << A< float >().foo() << std::endl;
std::cout << A< int >().foo() << std::endl;
}
クラステンプレートの外部で通常の静的フィールドを使用しますか?
まさに; テンプレート宣言の外の関数にそれを配置するだけです。
このシナリオで本当にアクセスを制限したい場合は、次のようなものを使用できます。
class t_shared {
static int& Shared() {
static int s(0);
return s;
}
public:
template < typename T >
class t_template {
public:
void f() {
std::cout << ++Shared() << std::endl;
}
};
};
int main(int argc, const char* argv[]) {
t_shared::t_template<int>().f();
return 0;
}
クラステンプレートは、静的メンバーに関して通常のクラスとは実際には少し異なります。foo.hpp
すべての翻訳ユニットに含まれている場合でも、以下は完全に問題ありません。
foo.hpp:
template <typename T> struct TmplFoo
{
static double d;
};
struct OrdFoo
{
static double e;
}
foo.cpp:
#include "foo.hpp"
double OrdFoo::e = -1.5;
の個別の定義は必要ないことに注意してくださいTmplFoo<T>::d
。TmplFoo<T>::d
リンカは、(特定のT
)へのすべてのローカル参照が同じオブジェクトを参照していることをどのように把握するかを知っています。