2016-05-31 13 views
1

鑑於層次:我有專門的模板,如果他們有問題的代碼是在if(假)

struct base {}; 
struct a : public base {}; 
struct b : public base {}; 

我要填寫vector<base*> vecBasevector<a*> aVec使用此項功能:

template <typename T> 
void foo(T* bar) { 
    if (is_base_of_v<decltype(baseVec)::value_type, T>) baseVec.push_back(static_cast<decltype(baseVec)::value_type>(bar)); 
    if (is_base_of_v<decltype(aVec)::value_type, T>) baseVec.push_back(static_cast<decltype(aVec)::value_type>(bar)); 
}   

的問題在於,即使static_cast永遠不會被執行,除非它是合法的;像這些調用失敗編譯:

int myInt; 
b myB; 

foo(&myInt); 
foo(&myB); 

我知道我可以專門foo。這就是我在這裏必須做的,或者是否有辦法讓編譯器知道違規的static_cast永遠不會發生?

+5

「靜若」是不是(還)的支持,因此各分公司應該是有效的。 – Jarod42

+0

@ Jarod42我的心跳得快樂......在我們的將來是「靜止的」嗎? –

+2

相關http://stackoverflow.com/questions/13799420/why-there-is-no-static-if-in-c11 – Jarod42

回答

1
  1. static if是你在找什麼。它最初由N3329 on Jan-10-'12提出。

  2. On Mar-16-'13 Bjarne Stroustrup, Gabriel Dos Reis, and Andrew Sutton put forward N3613其中指出的static if

這項建議將做更多的弊大於利。解決這些問題的語言特性不得對語言和我們圍繞它構建工具的能力產生負面影響。我們認爲應該放棄static if的未來發展,而應該採用諸如「概念 - 精簡」方法等替代方案。

  1. 年09月 - 23-'13的C++芝加哥會議的概念研究組指出,他們weren't including static if in their scope for the near future

  2. 芝加哥會議所做的static if產卵威樂Voutilainen的簡化:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4461.html

  3. 的C++ Lexena會議五月-4- '15做了討論簡化和encouraged the original authors to come back to the C++ Kona meeting on Oct-19-'15

  4. 在C++科納會議Herb Sutter personally presented static if 。他回憶說,

在房間裏,甚至Bjarne的反饋,是從的角度來看它可能感興趣的:這可能是得到一個版本概念/概念精簡版的爲C的唯一途徑++ 17。在這個標準的重大修訂中,我們沒有其他辦法可以將Concepts或其他任何類似的方法。所以這是早期的,但它已經提出。有一些興趣。我們現在需要跟進,這些事情需要時間和幾個週期,但正在提出。


但現在你將有專門的模板:

template <typename T> 
enable_if_t<negation_v<is_base_of<base, T>>, void> push(T*) {} 

void push(base* i) { 
    baseVec.push_back(static_cast<decltype(baseVec)::value_type>(i)); 
} 

void push(a* i) { 
    baseVec.push_back(static_cast<decltype(baseVec)::value_type>(i)); 
    aVec.push_back(static_cast<decltype(aVec)::value_type>(i)); 
}