我正在构建一个模板结构,我需要一些技巧来执行以下操作:
我有一个单维和二维链表,我需要先构建每个节点,其中没有数据,然后我必须用文件中的数据填充它们。所以我需要if(x == UNINITIALIZED OR NOT)
因为数据可能是string,int和double。如果检查,我找不到一个常见的null初始化器。我希望有办法做到这一点。
我尝试了if(x == NULL)
,if(x == 0)
,if(x == "")
,if(x == void)
。他们都没有工作。
答案 0 :(得分:0)
如果您的节点代表指定的类型之一,您只需使用模板,模板专门化或重载。
答案 1 :(得分:0)
如果您只有这三种类型,则可以为已知类型创建专门的初始化函数。
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 = ""; }
};
当然,还有一些方法可以为模板化函数指定类型细节,但我不记得这一点。我知道Boost使用它们,这将是一种在原始定义之外指定其他初始化方法的方法。
答案 2 :(得分:0)
据我了解您的问题,我认为以下代码显示了使用两个Boost库的可能且有趣的解决方案:Optional和Tuple:
#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());
}