2017-02-27 109 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那樣訪問。

再一次,宏的作用是在編譯代碼之前替換一些代碼。沒有其他的。通常我不會提到它,但是你的問題讓我覺得你沒有意識到這一點。

也就是說,如果你使用這樣的宏,你應該有一個很好的理由。在正常情況下不會推薦它。如果使用錯誤,宏可能非常糟糕。只有在你完全理解你的所作所爲時,才能真正使用它們。我認爲你不會,對不起,但請閱讀該主題。編碼不知道它是如何工作的只會造成挫折。

此外,只能同意一些程序員老兄的回答,「使用」遠比宏在這種情況下好。只需提兩次。