考虑以下宏:
#define hash<k1,v1> abc
现在通过一些方法,我有abc
的实例,现在我想使用v1
为abc
分配一个值,我该怎么做。
我试着做abc->v1 = 10;
我也试过abc.v1 = 10;
但他们俩都没有工作。请提供一个简单的解决方案。
请看这个更新的问题:
将宏视为:
#define mac<a,b> abc
我的函数的返回类型为abc
类型。
说xyz = func()
现在在xyz
的帮助下,我想访问a并为a分配一些值,比如说
a = 10;
如何访问变量&#39; a
&#39;,并使用xyz
为其指定值。
答案 0 :(得分:5)
您有向后预处理器宏定义。如果您希望将abc
扩展为(替换为)hash<k1, v1>
,那么它应该以相反的方式定义:
#define abc hash<k1, v1>
然后你就可以做到。
abc xyz;
这与
相同hash<k1, v1> xyz;
另请注意,这并非使用预处理器宏,我建议您使用类型别名:
using abc = hash<k1, v1>;
然后abc
是一个实际的类型名称,可以用作任何其他类型。
答案 1 :(得分:0)
根据您的宏定义,abc
引用了类hash<k1, v1>
或函数hash<k1, v1>
,它们都不允许使用->
或.
进行成员访问语法。
如果您的班级hash<k1, v1>
有静态成员,则应使用::
语法通过以下方式访问成员:
hash<k1, v1>::v1
// or
abc::v1
或者你应该有abc
的实例:
abc xyz;
xyz.v1 = ...;
说明显而易见的是,如果hash<k1, v1>
引用的是函数而不是类,则没有成员可以访问,所以没有办法。
答案 2 :(得分:0)
首先:v1 不变量。您似乎在理解您编写的代码时遇到了一些非常基本的问题。 v1是模板参数。 “访问v1”意味着与“访问字符串”相同,特别是因为v1实际上可以是字符串。这是胡说八道。当然有参数是数字,但它们又是一样的:访问v1与访问3相同。不是变量,只是一个值。
第二:如何访问“type”abc变量中的某些内容取决于您如何访问hash类型变量中的某些内容。我不确定哈希是什么,std :: hash只有一个参数,但如果它的行为类似于std :: map,你通常会通过[] -brackets访问。
我们举个例子:
#define MyMap std::map<string, string>
MyMap create_some_map(){
MyMap result;
result["name"] = "john";
return result;
}
int main(){
MyMap some_map = create_some_map();
std::cout << some_map["name"] << std::endl;
return 0;
}
不是那么难吗?
如果MyMap是std :: pair的替代,你可以通过some_map.first = ...和some_map.second = ...等来访问元素。如果MyMap是某种矩阵类型,就像来自Eigen库的矩阵一样,你可能会像some_map(i,j)= 4那样访问。
同样,宏的作用是在编译之前替换一些代码。没有其他的。通常我不会提及它,但你的问题让我觉得你没有意识到这一点。
那就是说,如果使用这样的宏,你应该有一个很好的理由。在正常情况下不会推荐它。如果使用错误,宏可能会非常糟糕。当他们确实真正地拯救你的工作并且只有在你完全理解你的工作时才使用它们。我认为你没有,对不起,但请阅读这个主题。在不了解其工作原理的情况下进行编码只会导致挫败感。
另外,只能同意一些程序员的答案,“使用”在这种情况下远胜于宏。只是提到这两次。