#include "stdafx.h"
#include <tuple>
#include <functional>
#include <boost/utility/declval.hpp>
class cBuffer
{};
template<typename T>
class cBufferT : public cBuffer
{};
template <typename T, typename FUNC>
struct cCallbackChecker
{
struct HasNoParam
{
template <typename U>
static auto test(U *x, FUNC i_callback) -> decltype((x->*i_callback)(), char());
template <typename U>
static auto test(...) -> int;
enum
{
value = sizeof(test<T>(0, 0)) == 1
};
};
struct HasParam
{
template <typename U>
static auto test(U *x, FUNC i_callback) -> decltype((x->*i_callback)(std::declval<cBuffer *>()), char());
template <typename U>
static auto test(...) -> int;
enum
{
value = sizeof(test<T>(0, 0)) == 1
};
};
};
template<typename FUNC, typename STATION>
void bindCallback(STATION *i_station, typename std::enable_if<cCallbackChecker<STATION, FUNC>::HasNoParam::value, FUNC>::type i_callback)
{
}
template<typename FUNC, typename STATION>
void bindCallback(STATION *i_station, typename std::enable_if<cCallbackChecker<STATION, FUNC>::HasParam::value, FUNC>::type i_callback)
{
}
template<typename FUNC, typename STATION>
void test(STATION *i_station, FUNC i_callback)
{
bindCallback<FUNC, STATION>(i_station, i_callback);
}
struct Test
{
// void f(cBuffer *); //works
void f(cBufferT<int> *); // not works
{}
};
struct Test2
{
void f()
{}
};
int main(int argc, char* argv[])
{
auto b = boost::declval<int>();
Test t;
test(&t, &Test::f);
Test2 t2;
test(&t2, &Test2::f);
}
此代码不能使用VS2013编译,而是使用VS2010编译。
VS2013问题:
C2770: invalid explicit template argument(s) for 'void bindCallback.
那么,是否有人知道为什么会出现这种错误以及在这种情况下该怎么做。我想检查一个成员函数是否确实存在给定的签名。
我现在可以使用no参数案例。但现在我还想支持cBuffer *
类型的单个参数。在VS2010中,此代码有效。在VS2013中没有。