簡體   English   中英

c ++模板成員函數,可根據模板參數更改參數

[英]c++ template member function that changes parameters depending on template parameter

---編輯更多上下文---

可以說我有一個名為TempClass的類。 顧名思義,它是一個模板類。 它有一堆對這個問題並不重要的東西,但有趣的是一個叫做addTo的成員函數和一個unordered_map對象的成員變量。 讓我們稱之為inserted 使用addToinserted所有內容放入addTo addTo應該做的是制作一些對象,然后將其插入給定鍵的集合中。 插入的實例應在函數內部創建,而不是傳遞給函數。

addTo(KeyType key, ...) // im looking for what I should put at ...

基本上,我在按鍵之后都會陷入困境。 我需要一種方法可以為新創建的實例指定數據,而不必擔心對象的生存期或通過調用std :: make_xxx(共享,唯一等)使事情復雜化。

這就是我想要的名字

TempClass<std::string> stringClass();
stringClass.addTo(whereToAddIt, "This was selected because of std::string");
TempClass<Vector3f> vectorClass();
vectorClass.addTo(someOtherLocation, 12.0f,12.0f,3.0f); //adds a vec(12.0f,12.0f,3.0f)

我已經看到這種方式,如果這是一種好的做法,那么我通常會喜歡這種方式。

我嘗試過的

  • 將指針傳遞給函數------>可以,但是很愚蠢。 它要求我注意刪除對象
  • 在插入------>之前傳遞一個臨時對象並復制它是可行的,但是我不喜歡只為了刪除它而復制該對象。 它似乎是多余的,對於我的特定應用而言並非最佳。

我以前看過這件事,但是我不記得在哪里(相信我,我已經試過記住這一點,因為如果可以的話,我自己可以自己查一下)。 請向我詳細說明如何執行此操作及其工作方式。

請幫我弄清楚!

您可以使用重載,然后在模板類型為特定類型時啟用特定重載

 
 
 
  
  #include <type_traits> //for enable_if and is_same template<typename T> class MyClass { public: template<typename = std::enable_if<std::is_same_v<T, std::string>>> void someMember(string param1, int param2); template<typename = std::enable_if<std::is_same_v<T, Vector3f>>> void someMember(string param1, int param2, int param3); };
 
  

這將選擇第一個重載為T為std:string,如果第二個重載為T為Vector3f。

編輯:查看您已編輯的問題,更好的方法是將T的實例傳遞給您的addTo函數。 喜歡:

void addTo(std::string key, T const& value);

EDIT2:我想我終於知道您真正想要的是什么。 您需要使用可變參數模板和完美的轉發。 這似乎令人困惑,所以我將給您代碼:

template<typename KeyType, typename... Args>
void addTo(KeyType key, Args&&... args)
{
   //now construct the new element with:
   T elem(std::forward<Args>(args)...);
}

您將需要包含實用程序頭。 有關可變參數模板的更多信息,請參見cppreference

您可以使用可變參數模板和完美的轉發來放置ak / v對:

template<class K, class V>
struct foo {
    template<class... Args>
    void addTo(K k, Args&&... args) {
        mp.emplace(
                std::piecewise_construct, 
                std::forward_as_tuple(k),
                std::forward_as_tuple(std::forward<Args>(args)...)
                );
    }
    std::unordered_map<K, V> mp;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM