0

テンプレート構造を構築していますが、次のことを行うにはいくつかのトリックが必要です。

私は 1 次元および 2 次元のリンク リストを持っています。最初にデータを含まないすべてのノードを構築し、その後ファイルからデータを入力する必要があります。if(x == UNINITIALIZED OR NOT)データは文字列、int、および double になる可能性があるため、必要です。そのifチェックのためだけに、一般的なnull初期化子が見つかりませんでした。これを行う方法があることを願っています。

私は、、、試してみif(x == NULL)ました。それらのどれも機能しませんでした。if(x == 0)if(x == "")if(x == void)

4

3 に答える 3

0

あなたの問題を理解している限り、次のコードは、OptionalTupleの 2 つのBoostライブラリを使用する可能性のある興味深いソリューションを示していると思います。

#include <cassert>
#include <algorithm>
#include <iterator>
#include <list>
#include <string>
#include <boost/optional.hpp>
#include <boost/tuple/tuple.hpp>

int main()
{
    typedef boost::tuple<std::string, double, int> value_t;
    typedef boost::optional<value_t> node_t;

    std::list<node_t> nodes;

    // first construct every node with no data in them 
    std::fill_n(std::inserter(nodes, nodes.begin()), 5, node_t());

    // check all nodes have not been initialized yet, so they are in "null" state
    auto it = nodes.cbegin();
    while (it != nodes.cend())
    {
        assert(!it->is_initialized());
        ++it;
    }

    // add non-null initialized node
    // or fill with the data from a file, etc.
    node_t n("abc");
    nodes.insert(it, n); 
    assert(nodes.back().is_initialized());
}
于 2012-04-29T00:41:49.273 に答える
0

If you only have those three types, you could create specialized initializer functions for the known types.

template <class T>
class CNode {
public:
    CNode() {
       Init(m_Value);
    }

private:
    T m_Value;

    static void Init(T n) { n = 0; }  // Default catch for types that can be set to 0/NULL
    static void Init(bool b) { b = false; }
    static void Init(string str) { str = ""; }
};

Of course there are also ways of specifying type specifics for templated functions, but I don't remember that offhand. I know Boost uses those, it would be a way of specifying additional methods of initialization outside of the original definition.

于 2012-04-29T00:22:06.160 に答える
0

ノードが指定されたタイプの 1 つを表している場合は、単純にテンプレート、テンプレートの特殊化、またはオーバーロードを使用できます。

于 2012-04-28T22:23:31.673 に答える