2014-10-16 56 views
1

我正在用一個小函數庫編寫Matrix類。爲庫輸入參數的正確方法

該課程能夠實現急切和懶惰的評估。我希望用戶選擇課程是否總是渴望或者如果可能的話會很懶。

問:是否有提供這種輸入一個標準的方式?

我沒有太多的經驗,所以我沒有真正看過標準庫或增強版或其他版本是否(以及如何)這樣做。可能使用的方式可能是:

  1. 有一個靜態全局變量併爲用戶提供一個設置其值的方法。
  2. 檢查一個預處理器指令,如果已定義或不確定要編譯的類的代碼。
  3. 其他???
+0

如果要在編譯時執行此操作,可以使用模板在不同類型的功能之間切換。 – shuttle87 2014-10-16 19:51:15

+0

@ shuttle87如何使用該模板?例如一個數字模板參數,當一個對象被實例化時,你爲那個特定的矩陣設置了那個參數? – Kae 2014-10-16 19:53:45

+1

您可以使用模板將用戶選擇作爲策略實施。在這裏閱讀更多信息:http://en.wikipedia.org/wiki/Policy-based_design或A. Alexandrescus的書「現代C++設計」 – pmatyszok 2014-10-16 19:58:02

回答

1

我假設這是一個只有頭模板庫。

如果你只想提供一個全局開關(而不是每個表達式選擇),這似乎是一個合理的使用宏開關。我可能會設計出庫,使得用戶可以做到

#define GREAT_LIBRARY_DISABLE_LAZY_EVALUATION 
#include <great_library/matrix.hpp> 

甚至

$ cxx -DGREAT_LIBRARY_DISABLE_LAZY_EVALUATION file.cpp 

當然,你應該做的更一般的選項的默認,而不是拋出一個錯誤,如果用戶沒有按沒有選擇任何東西。

但是,如果被定義的宏與否不改變究竟是不是一個有效的利用圖書館的類型和功能什麼的,這隻會是有用的。如果你的用戶在定義宏後發現他們最初工作的代碼導致編譯器錯誤頁面,他們可能會不高興。因此,如果它不是一個「不可見」開關(即影響性能,但不影響程序的語義),則最好在每個使用點提供細粒度的控制。

也許與您的模板採取可選參數。

great_lib::Computer<great_lib::EvaluationPolicy::Eager> eager_one; 
great_lib::Computer<great_lib::EvaluationPolicy::Lazy> lazy_one; 
auto some_result = eager_one.compute(arg1, ..., argN); 
auto some_other_result = lazy_one.compute(arg1, ..., argN); 

或使用tag dispatching

auto some_result = great_lib::compute(arg1, ..., argN, great_lib::eager_tag); 
auto some_other_result = great_lib::compute(arg1, ..., argN, great_lib::lazy_tag); 

最後,我不認爲像

great_lib::set_evaluation(gerat_lib::EvaluationPolicy::Eager); 
auto some_result = great_lib::compute(arg1, ..., argN); 
great_lib::set_evaluation(gerat_lib::EvaluationPolicy::Lazy); 
auto some_other_result = great_lib::compute(arg1, ..., argN); 

將在模板C++庫是非常有用的。你真的希望你的編譯器只生成用戶選擇的任何選項所需的代碼,但如果這取決於運行時的值,它將不得不爲兩種變體生成代碼(以及在運行時選擇它們的條件-時間)。更糟的是,您可能需要某種形式的運行時多態性,我們通常會嘗試避免使用高性能C++代碼。