是否可以根據模板參數的值有條件地編譯函數中的語句?例如:C++根據模板參數值更改成員函數定義
template<typename T, bool chk>
class subject
{
public:
// the ideal case
void doSomething(T new_val)
{
if(chk)
{
if(new_val != val)
//do_something only if new_val is different from val
}
else
{
//do_something even if new_val and val are equal
}
}
//or if that's not possible, if chk = 0 use this method
void doSomething(T new_val)
{
//do_something even if new_val and val are equal
}
// and if chk = 1 use this method
void doSomething(T new_val)
{
if(new_val != val)
//do_something only if new_val is different from val
}
T val;
};
美中不足的是基於CHK的價值我甚至不希望聲明if(new_val!=val)
編譯成函數(因爲此後每類型T使用就必須有一個=運營商定義的!)。
我想一個缺點這種方法的缺點是foo<int,0>
和foo<int,1>
是不同的類,所以它不會是可能的定義,如果CHK爲0或1(比如watch(foo<int>)
)不關心的功能。
我特別注意的應用程序是一個觀察者,對於某些類型,我只希望觀察者得到通知,如果該值實際發生更改,並且對於其他類型,我希望始終通知觀察者(以及對於那些類型I不想定義一個!=運算符)。
這可能沒有兩個單獨的類嗎?
這太好了。我曾看過enable_if,但IMO在cppreference.com上的文檔相當難以理解,並且聽起來好像不適合這樣(這可能是因爲我不太瞭解SFINAE的工作原理) –
實際上你介意添加一個簡單的解釋,說明enable_if_t給你的只是enable_if,或許它是如何工作的?再次我看了,但我很快就來了。 –
@schrödinbug你可以在這裏找到很多例子。比我能做的更好解釋! ;-) – skypjack