![](/img/trans.png)
[英]How do I pass a templated service into a class without including that service's header file in that class header?
[英]How do i pass initial setup values to a templated class in a succinct way?
這是一個非常簡化的問題版本,可以清楚地說明我在問什么。 我似乎無法在 Stack Overflow 上找到它,但我可能正在使用錯誤的詞進行搜索!
這是一個模板 Class,刪除了明顯的部分。
template <class T, bool clip = true>
class BOUNDED_VAL {
public:
BOUNDED_VAL(T initialMin, T intialMax) :locked(false) {
assert_or_throw(intialMax >= initialMin, HD_ERR_MINMAX_REVERSED);
min = initialMin;
max = intialMax;
value = initialMin;
};etc.
// assert_or_throw is a typedef which asserts during debug builds to prevent programmer mistakes (especially my own) or throws a rich catachable runtime error for user input just in case something gets around user input limit checking during release builds (A hard wall). Belt and braces approach...
現在我知道我可以將其設置為初始化私有 class 成員變量,如下所示:
private:
BOUNDED_VAL<int> testBoundInt = BOUNDED_VAL<int>(0, 10);
但
這是否會創建一個新的 BOUNDED_VAL 然后將其復制到成員變量上(或者編譯器在優化期間將其刪除)?
有沒有更簡潔的方法我只是找不到? 我知道以下內容不起作用,但例如:
private:
BOUNDED_VAL<int> testBoundInt(0,10);
或者
private:
BOUNDED_VAL<int>(0,10) testBoundInt;
我是在 C++ 自學的,所以這可能是一個顯而易見的問題……但你永遠不知道……
非常感謝
我知道以下內容不起作用,但例如:
private: BOUNDED_VAL<int> testBoundInt(0,10);
但這會起作用,前提是您的編譯器是在過去十年內編寫的:
BOUNDED_VAL<int> testBoundInt{0,10};
看起來您可能正在使用過時的教科書來學習 C++,該教科書未涵蓋當前版本 C++ 的統一初始化語法。強烈建議您獲取更新的學習材料。
這個 [copy initialization] 是否創建一個新的 BOUNDED_VAL 然后將其復制到成員變量上(或者編譯器在優化期間將其消除)?
這實際上取決於您的編譯器支持和配置使用的 C++ 版本。 根據幾個因素,它會被“清除”掉,或者我們到鄉間去一次風景優美的旅行,在那里構建一個 object,然后復制構建第二個 object,然后刪除第一個 object。
但現在這是一個次要話題,因為統一的初始化語法解決了原來的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.