2017-02-27 105 views
-1

考虑下面的宏中的一员:一些访问模板类的对象

#define hash<k1,v1> abc 

现在怎么样,我的abc实例跟我,现在我要分配使用abc一个值v1,我怎样才能做到这一点。

我试图做abc->v1 = 10;
我也试过abc.v1 = 10; 但他们都没有工作。请提供简单的解决方案。

请参阅本更新的问题:
考虑一个宏为:

#define mac<a,b> abc 

我有了返回类型为abc类型的函数。
xyz = func()
现在用的xyz的帮助下,我想访问并分配一定的价值的,说

a = 10; 

如何访问变量“a”,并为其分配使用xyz值。

+0

向我们展示您的代码,在这里我们看不到任何变量类型,如果您不知道abc是否是一个指针,我们怎么能看出它的定义呢? – user

+0

你的MACRO应该是什么? – Jarod42

+0

对于'std :: hash',访问类似于'abc [key] = value;'。 – Jarod42

回答

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>引用一个函数而不是一个类,则没有成员可以访问,所以没有办法。

5

您有预处理器宏定义落后。如果你想abc扩大到(替换)hash<k1, v1>那么它应该定义相反的方式:

#define abc hash<k1, v1> 

然后,你可以做如

abc xyz; 

这将是相同的

hash<k1, v1> xyz; 

另外请注意,这不是一个很好用预处理宏,我建议你使用类型别名来代替:

using abc = hash<k1, v1>; 

然后abc是一个实际的类型名称,可以用作任何其他类型。

0

首先:v1是而不是的一个变量。理解你编写的代码似乎有一些非常基本的问题。 v1是一个模板参数。 “访问v1”意思就像“访问字符串”一样,尤其是因为v1实际上可能是字符串。这是无稽之谈。当然有参数是数字,但是它又是一样的:访问v1将与访问3相同。不是变量,而只是一个值。

第二:如何访问“类型”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那样访问。

再一次,宏的作用是在编译代码之前替换一些代码。没有其他的。通常我不会提到它,但是你的问题让我觉得你没有意识到这一点。

也就是说,如果你使用这样的宏,你应该有一个很好的理由。在正常情况下不会推荐它。如果使用错误,宏可能非常糟糕。只有在你完全理解你的所作所为时,才能真正使用它们。我认为你不会,对不起,但请阅读该主题。编码不知道它是如何工作的只会造成挫折。

此外,只能同意一些程序员老兄的回答,“使用”远比宏在这种情况下好。只需提两次。