在不声明变量的情况下存储"variables"

Store "variables" without declaring a variable

本文关键字:存储 variables 情况下 声明 变量      更新时间:2023-10-16

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

像这样:

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

我正在徘徊,是否有任何方法可以存储单词字符串,而无需声明数百万个不同的变量以提高速度和更少的内存。有什么想法吗?

您可以为每个单词创建标签类型,并使用静态字符串对其进行管理:

// 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;
}

编译后,"目标代码"将是这样的:

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

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

是的,它太冗长了,但是"class-hierarchy.hpp"文件可以使用任何类型的预处理器来解析字典文件,例如:

// 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