2013-12-16 63 views
2

我想寫一個成員函數來檢測實例化對象是否爲const。如何從成員函數中檢測實例是否爲const?

舉個簡單的例子,我們可以考慮下面的類定義

class Foo{ 
    public: 
    void constnessChecker(){ 
     bool isConst; 
     // MORE CODE GOES HERE... 
     if (isConst) { 
     std::cout << "This instance is const! << std::endl; 
     } else { 
     std::cout << "This instance is not const! << std::endl; 
     } 
    } 
}; 

和下面的代碼

int main(){ 
    Foo foo1; 
    Foo const foo2; 
    foo1.constnessChecker(); 
    foo2.constnessChecker(); 
} 

應該產生

This instance is not const! 
This instance is const! 

這可能嗎?

+0

檢查'boost :: is_const',請參閱http://www.boost.org/doc/libs/1_55_0/libs/type_traits/doc/html/boost_typetraits/reference/is_const.html – arne

+0

@ame:您無法使用在成員函數中,你能嗎? –

+1

聞起來很糟糕。 「const實例」究竟是什麼?例如。是一個非顯式的const成員const?即'const struct {Foo foo; } bar;' - 是'foo'一個'const Foo'? – MSalters

回答

10

提供constnon-const重載:

class Foo 
{ 
    public: 
    void constnessChecker(){ 
     std::cout << "This instance is not const\n"; 
    } 
    void constnessChecker() const { 
     std::cout << "This instance is const\n"; 
    } 

.... 
}; 
+0

謝謝,它的工作原理。您的答案意味着編譯器將首先嚐試匹配成員函數的const版本。你能給我一個參考嗎? – carlo

+1

@carlo編譯器只有在對象爲非const時纔會嘗試匹配非const版本。如果沒有非常量版本,它將匹配常量。請原諒雙關語,但'const'是「非常」,所以一旦添加它就會傳播。 – Johan

+0

請注意,從ctor或dtor調用'constnessChecker'將始終報告'not const'。一般來說,從另一個成員函數調用它將返回_that成員function_是否是'const'。 – MSalters

0

boost::is_conststd::is_const的風格,你也可以寫了以下內容:

#include <iostream> 

template <typename T> 
struct is_const 
{ 
    static const bool value = false; 
}; 

template <typename T> 
struct is_const<const T*> 
{ 
    static const bool value = true; 
}; 

struct S 
{ 
    void f() const 
    { 
    std::cout << is_const<decltype(this)>::value << std::endl; 
    } 

    void f() 
    { 
    std::cout << is_const<decltype(this)>::value << std::endl; 
    } 

    int m; 
}; 

int main(int argc, char** argv) 
{ 
    const S& cs = S(); // note that choosing a const-ref is merely to force the compiler to choos S::f() const! 
    cs.f(); // prints 1 

    S().f(); // prints 0 

    return 0; 
} 

我沒有看過的std::is_const實施但由於某種原因,如果上述is_const返回true,則返回false。

注意:很明顯,您需要支持decltype,因此上述僅適用於符合C++ 11的編譯器。

相關問題