[英]compile-time conditional member function call in C++
我有一個模板類,僅當模板參數滿足某些條件時,某些成員函數才有意義。 例如,使用std::enable_if<>
我只能為這些情況定義它們,但是如何有條件地調用它們呢? 這是一個簡單的例子
template<class T> class A
{
typename std::enable_if<std::is_floating_point<T>::value>::type a_member();
void another_member()
{
a_member(); // how to restrict this to allowed cases only?
}
};
首先,您不能像這樣使用SFINAE-模板類型參數必須位於函數而非類上。
完整的解決方案如下所示:
template<class T> class A
{
private:
template <class S>
typename std::enable_if<std::is_floating_point<S>::value>::type a_member() {
std::cout << "Doing something";
}
template <class S>
typename std::enable_if<!std::is_floating_point<S>::value>::type a_member() {
//doing nothing
}
public:
void another_member()
{
a_member<T>();
}
};
int main() {
A<int> AInt;
AInt.another_member();//doesn't print anything
A<float> AFloat;
AFloat.another_member();//prints "Doing something"
}
嘗試將其添加到類聲明中:
typename std::enable_if<std::is_floating_point<T>, int*>::type a_enabled_p() { return 0;};
void another()
{
if((a_enabled_p()+1)==1)
{
//Not enabled
}
else if((a_enabled_p()+1)==sizeof(int))
{
//Is enabled
}
}
這就是這種恐怖可能起作用的原因。 如果它們是浮點數,則謂詞的返回值為int*
。 如果它們是,則沒有typedef,它默認為int
(我希望)。 當您將1加到int*
,實際上就是在添加sizeof(int)
。 將1加到int會加1。 這意味着通過檢查加一的值,我們知道。
注意:請勿使用此功能。 提出來很有趣,但以上答案是MUCH,MUCH
更好。 不要使用這個。 請。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.