- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个可以处理多种形式数据的“知识处理器”。我计划支持的数据形式是文本、视觉和听觉。每个都可以分别通过 TEXT、VISUAL 和 AUDIO 表示。因此,每个“知识”或数据都以称为“know_t”的结构表示。
#define VISUAL 0
#define AUDIO 1
#define TEXT 2
struct know_t {
k_type_t type;
text_k_t text_value;
visual_k_t visual_value;
audio_k_t audio_value;
};
k_type_t 是来自 int 的类型定义。它用于存储数据的“类型”,可以用代码段开头的#define'd 宏表示。
言归正传,我正在为处理器编写一个搜索算法。这些类型中的每一种,VISUAL、AUDIO 和 TEXT,都可以用“原型(prototype)”形式表示。例如,TEXT 数据可以通过 std::string 表示。这种数据的原型(prototype)形式将用于搜索知识数据库。为了便于搜索,我创建了一个名为“search_t”的结构来表示搜索。
struct search_t {
k_type_t type;
visual_t visual_value;
audio_t audio_value;
std::string text_value;
bool operator == (const struct __search_t &in);
};
现在这里的结构可能看起来和上面的结构几乎一模一样,know_t,它们有很大的不同。例如,虽然类型“k_type_t”包含字符串的数据,例如定义,但 std::string 是用于搜索的数据的一种形式。所有其他形式的数据也是如此。
我正在使用 C++ 的 unordered_map 来完成搜索。 ISO C++ 标准规定,要使 unordered_map 起作用,键类型需要散列函数和“==”运算符,在本例中为 search_t。为此,我决定编写一个 get_value 函数来返回搜索结构的原型(prototype)值。问题是随着数据类型的改变,返回类型也会改变。
到目前为止,我已经为 == 运算符编写了以下代码,但我的编译器(带有 -std=c++11 的 GCC 4.8.1)似乎不喜欢它。
#define test(in) in.type == VISUAL ? in.visual_value : \
in.type == AUDIO ? in.audio_value : \
in.type == TEXT ? in.text_value : NULL
bool search_t::operator == (const struct search_t &in) {
auto getval_search = [](const search_t &in) -> decltype(test(in)) {
if (in.type == __VISUAL__)
return in.visual_value;
if (in.type == __AUDIO__)
return in.audio_value;
if (in.type == __TEXT__)
return in.text_value;
}
bool equal = (bool)((this->type) == in.type);
if (!equal)
return false;
search_t tmp = *this; // bugfix
if (getval_search(tmp) == getval_search(in))
return true;
}
有办法解决这个问题吗?
最佳答案
是的。修复它的简单方法是编写一个普通的 ==
比较:
struct search_t { // because C++
k_type_t type;
visual_t visual_value;
audio_t audio_value;
std::string text_value;
bool operator == (const search_t& in) const {
return type == in.type && visual_value == in.visual_value
&& audio_value == in.audio_value && text_value == in.text_value;
}
};
如果它真的只是基于类型,那么我想你可以这样做:
bool operator == (const search_t& in) const {
if (type != in.type) return false;
switch (type) {
case __VISUAL__: return visual_value == in.visual_value;
case __AUDIO__: return audio_value == in.audio_value;
case __TEXT__: return text_value == in.text_value;
default: return false; // or something
}
请注意,根据 [global.names],您的 type
是无效标识符:
Each name that contains a double underscore __ or begins with an underscore followed by an uppercase letter (2.12) is reserved to the implementation for any use.
最后,这可能不是一种适合存储的数据类型。考虑使用:
using search_t = boost::variant<visual_t, audio_t, std::string>;
关于C++ 基于输入参数的返回类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28291195/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!