如何實現使用標準c++代替MSVC的__if_exists, 實現檢測模版參數類中是否有某個成員函數

需要實現判斷從模版傳入的類是否擁有指定成員函數, 或者有別的方法, 最好不要用到boost. 謝謝各位.


在VS2015下編譯通過,如果你沒有void_t,自己寫一個也無妨

推薦閱讀:

std::void_t - cppreference.com

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4436.pdf

https://www.youtube.com/watch?v=VctviQl-SR4我補充一句,樓下的寫法都太老了,C++98時代就這麼寫了,我這個是modern C++的寫法


利用RTTI的typeof,或者C++11的decltype實現。

有不少關於模板的書上都給出了例子,boost里也有類似實現。可以參考下面的鏈接:

http://stackoverflow.com/questions/257288/is-it-possible-to-write-a-c-template-to-check-for-a-functions-existence


///
/// 測試函數成員
///
#define FUNCTION_NAME fuck

struct HasMemberFunctionTest {
template&< typename T, typename... TArgs &>
static auto test(int) -&> decltype(std::declval&().FUNCTION_NAME(std::declval&() ...), std::true_type());

template&< typename T, typename... TArgs &>
static auto test(...) -&> std::false_type;
};

template&< typename T, typename... TArgs &>
using HasMemberFunction = decltype(HasMemberFunctionTest::test&< T, TArgs... &>(0));

///
/// 測試類型成員
///
#define TYPE_NAME Fuck

struct HasMemberTypeTest {
template&< typename T &>
static auto test(typename T::TYPE_NAME *) -&> std::true_type;

template&< typename T &>
static auto test(...) -&> std::false_type;
};

template &< typename T &>
using HasMemberType = decltype(HasMemberTypeTest::test&(nullptr));

借鑒&抄襲&了Boost


as far as I know, It doesn"t exists in C++1z。

__if_exists can enabile/dislable blocks.


給你指條路:自己山寨一個boost.hana的isvalid


#include &

template&

struct has_alloc

{

private:

template& static auto check(int) -&> decltype(U::alloc(std::declval&()...), std::true_type());

template& static std::false_type check(...);

public:

enum { value = std::is_same&(0)), std::true_type&>::value };

};

這裡判斷了目標類中是否定義了alloc,如果你還需要判斷其它成員可再搞個宏。

Args是可變模板參數,所以這個還支持判斷alloc的參數情況

使用方法如下:

class target

{

static target* alloc();

}

if (has_allocator&::value)

{

// XXX

}

或者if (has_allocator&::value) 這裡代表alloc是否有個int類型的參數即:alloc(int)。

標準C++,沒有boost,VS2013環境。


推薦閱讀:

TAG:編程 | C | 模版 | 元編程 | GCC | VisualC |