1

次のようなものがあるとします。

struct EmptyClass{};
template<typename T1, typename T2 = EmptyClass,
         typename T3 = EmptyClass, typename T4 = EmptyClass,
         ..., typename T20> class PoorMansTuple {
  T1 t1;
  T2 t2;
  ...
  T20 t20;
};

これで、PoorMansTuple ごとに最大 19 バイトを浪費する可能性があります。

質問は:

1) サイズ 0 のクラスを作成する方法はありますか?

2)変数を条件付きで定義する方法はありますか? 次のようなもの:

  T1 t1;
  if (T2 != EmptyClass) T2 t2; // pseudo code
  if (T3 != EmptyClass) T3 t3; // ...

ありがとう!

黒魔術マクロの使用は認められています。

MacOSX で g++ を使用しています。

4

4 に答える 4

4

部分的な専門化は、質問の最初の部分で探しているものかもしれません。このプログラム

#include <string>
#include <iostream>

struct EmptyClass {};

template<typename T1, typename T2>
class Tuple
{
   T1 t1;
   T2 t2;
};

template<typename T1>
class Tuple <T1, EmptyClass>
{
   T1 t1;
};


int main (void)
{
    Tuple<std::string, std::string> two;
    Tuple<std::string, EmptyClass> one1;
    Tuple<std::string> one2;

    std::cout << "<string, string>: " << sizeof(two) << std::endl;
    std::cout << "<string, empty> : " << sizeof(one1) << std::endl;
    std::cout << "<string>        : " << sizeof(one2) << std::endl;

    return 0;
}

版画

<string, string>: 32
<string, empty> : 16
<string>        : 16
于 2010-02-19T00:59:10.080 に答える
1
  1. クラスにはある程度のサイズ (少なくとも 1 つ) が必要です。「 C/C++ で可能な最小オブジェクト サイズは?」を参照してください。
  2. 私の知る限り、できません。
于 2010-02-19T00:41:49.200 に答える
1

1) いいえ、クラスのインスタンスがメモリ アドレスを持つことができなかったためです。アドレスを持つには少なくとも 1 バイトが必要です。-- そうは言っても、インスタンスと直接参照を持たないクラス (たとえば、テンプレート生成でのみ使用される) は、コンパイルされたプログラムにないため、サイズがありません。

2) マクロなしではありません...または、boost.orgの忍者だけが習得できる、あいまいなテンプレートの黒の芸術. コンパイル時の「if」のアイデアについて聞いたことがありますが、現在、AFAIK言語の今後の標準には含まれていません。それはそれを許したでしょう。すでに述べたように、おそらくそれを作るためのトリックがあります。

于 2010-02-19T00:20:22.923 に答える
1

チェックアウトしboost::tupleboost::compressed_pair. クラスは sizeof 0 を持つことはできませんが、「空の基本クラス」最適化の概念があります。ええ、私は以前の回答の1つにリンクするつもりです。それはここでかなり関連しています IMO: What is std::pair?

于 2010-02-19T01:03:01.757 に答える