存储"变量"没有声明变量

时间:2015-03-13 00:56:35

标签: c++

我正在尝试创建一个说话AI。为此,我正在为英语中的每个单词(或短语)创建一个类列表。有点像Wiktionary 具有

这样的事情:

class english {
    class lemma {
        class adjective {
            class uncomparable { 
                // Word strings here.
        };
    };  
};

如果有任何方法可以存储单词字符串而没有为速度和更少的内存声明数百万个不同的变量,那么我就会徘徊。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以为每个单词创建标记类型,并使用静态字符串管理它们:

// class-hierarchy.hpp
#ifndef CLASS_HIERARCHY_HPP
#define CLASS_HIERARCHY_HPP

struct english {
    struct substantives {
        struct House;
        struct Horse;
    };
};

// Optional; to avoid long qualified names.
using House = english::substantives::House;
using Horse = english::substantives::Horse;

template<typename WordTag>
struct WordTraits;

template<> struct WordTraits<House> { static constexpr const char* word = "House"; };
template<> struct WordTraits<Horse> { static constexpr const char* word = "Horse"; };

template<typename TagWord>
constexpr char const* getString()
{ return WordTraits<TagWord>::word; }

#endif // CLASS_HIERARCHY_HPP

// main.cpp
#include <iostream>
#include "class-hierarchy.hpp"

int main()
{
    std::cout << getString<Horse>() << std::endl;
    std::cout << getString<House>() << std::endl;
}

编译后,&#34;目标代码&#34;会是这样的:

int main()
{
    std::cout << "Horse" << std::endl;
    std::cout << "House" << std::endl;
}

因为进程的其余部分由编译器管理。

是的,它太冗长了,但是&#34; class-hierarchy.hpp&#34;可以使用任何类型的预处理器生成文件,解析字典文件,如:

// dic.txt
english {
  substantives {
    "House", "Horse"
  };
};

例如,可以使用bison创建该解析器。最后,namespace层次结构不是class hierarchy更好吗?

这里有一个工作样本:http://coliru.stacked-crooked.com/a/100b0604f7cd2ed6

当然,使用预处理器可以减少冗长:

#define WORD(x, y) \
   using y = x; \
   template<> struct WordTraits<y> { \
     static constexpr const char* word = #y; \
   };

struct english {
    struct substantives {
       struct House;
       struct Horse;
    };
};

template<typename WordTag>
struct WordTraits;

WORD(english::substantives::House, House);
WORD(english::substantives::Horse, Horse);

工作示例:http://coliru.stacked-crooked.com/a/9f8e7d1490a2c597