簡體   English   中英

在 C++ 中,使用參數包作為初始化列表是不好的做法嗎?

[英]In C++, is it bad practice to use a parameter pack as an initializer list?

我目前正在試驗可變參數模板,因為我正在嘗試將可變參數類模板用於我正在處理的項目。 我希望該類接受一個整數列表,這些整數將用於創建該類的其他元素。 最初,我使用模板構造函數來獲取整數數組。 但是,我在鏈接代碼時遇到了問題。 我想出了一種使用可變參數類模板來獲取整數列表來解決我的問題的替代方法,但是我很好奇這段代碼是否被認為是糟糕的 C++(我有一段時間沒有編寫 C++,這感覺很hacky)。 無論如何,這是我編寫的測試代碼,它按預期編譯和工作:

template<int...structure>
class testClass{

public:
testClass(){
      std::size_t size = sizeof...(structure);
      std::cout << size << '\n';
      int arr[]{ structure... };
      for (int i = 0; i < size; i++) 
          std::cout << arr[i] << '\n';
   }


};

int main() {
   testClass<1, 2, 3> c;
}

正如預期的那樣,代碼輸出:

3
1
2
3

這個解決方案有什么問題嗎? 我一直在網上搜索,似乎沒有人以這種方式使用可變參數模板。

提前感謝您的意見。

您的解決方案沒有任何問題或問題,這只是一種權衡。 使用您的解決方案,您可以立即初始化陣列,使其具有最佳性能。 使用std::initializer_list解決方案,他們必須默認數組的成員,然后復制更多的工作。

另一方面,這意味着您只能在編譯時構造對象,而std::initializer_list版本可以在運行時初始化。

另一個問題是將它們存儲在容器中。 您不能在std::vector存儲不同的testClass ,因為不同的模板參數意味着它們是不同的類型,而 vector 僅存儲單個元素類型。 如果您使用std::initializer_listtestClass將不是模板,您可以將不同的存儲在同一個vector

唯一的問題是包可以是空的,但不能是數組。 所以在你的例子中, testClass<> c; 不會編譯。

要么專門化您的類,以便僅定義具有非零數量參數的實例,要么在數組中提供占位符元素:

int arr[]{ 0, structure... };

取決於你想要什么。

我希望該類接受一個整數列表,這些整數將用於創建該類的其他元素

您沒有一個接受整數列表的類。 您擁有的是一個可以使用整數列表實例化的模板。 這是一個很大的不同。 如果使用不同的整數實例化模板,則會得到不同的類型。 例如testClass<1,2>testClass<1,2,3>是兩種不同的類型,它們幾乎沒有共同點(實際上只是同一個模板的實例化)。 如果這是你想要的,你的方法沒問題。

暫無
暫無

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

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