簡體   English   中英

用於檢查是否存在重載成員函數的模板

[英]template to check for existence of overloaded member function

如果一個類有一個像這樣的特殊成員函數(在另一個例子中找到),我嘗試專門化一個模板:

template <typename T>
class has_begin
{
    typedef char one;
    typedef long two;

    template <typename C> static one test( decltype( &C::AnyFunc) ) ;
    template <typename C> static two test(...);

public:
    enum { value = sizeof(test<T>(0)) == sizeof(char) };
    enum { Yes = sizeof(has_begin<T>::test<T>(0)) == 1 };
    enum { No = !Yes };
};

這很有效,直到AnyFunc重載:

class B : public vector<int>
{
public:
    void AnyFunc() const;
    void AnyFunc();
};

如何從我的模板中重寫我的測試代碼以獲得“是”?

必須將使用不帶參數的重載函數名稱(13.4p1)解析為單個重載(13.4p4),否則將發生替換失敗。

如果您正在測試是否存在成員函數,那么您應該知道您計划使用的參數:

    template <typename C> static one test(
        typename std::add_pointer<decltype(std::declval<C>().AnyFunc())>::type);

通常,您可以使用可變參數模板和類似於result_of的模式:

    template <typename C, typename... Args> static one test(
        typename std::add_pointer<decltype(
            std::declval<C>(std::declval<Args>()...).AnyFunc())>::type);

使用add_pointer允許它使用add_pointer作為函數參數類型的函數返回類型(例如void )。

找到有效的版本:

    template <typename C> static one test( decltype(((C*)0)->AnyFunc())* ) ;

如果要驗證該對象是否具有const函數,請使用:

    template <typename C> static one test( decltype(((const C*)0)->AnyFunc())* ) ;

此版本不會檢測帶參數的函數:

class B : public std::vector<int>
{
public:
    //void AnyFunc() const;
    //void AnyFunc();
    int AnyFunc(int);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM