在C++ 11你能做到這一點,但它幾乎擊敗這個類的目的:
template<typename T, typename U, U ptr, typename... Args>
struct TypeOverload;
template<typename T, typename U, typename... Args, U(T::* ptr)(Args...)>
struct TypeOverload<T, U(T::*)(Args...), ptr, Args...>
{
using type = decltype((std::declval<T>().*ptr)(std::declval<Args>() ...)) (T::*)(Args ...);
};
因爲使用情況如下:
using bar_t = TypeOverload<Foo, decltype(&Foo::bar), &Foo::bar, int, int>::type;
static_assert(std::is_same<bar_t, void(Foo::*)(int,int)>::value, "");
demo
但用auto
模板參數在C++ 17中,你可能有t他:
template<typename T, auto ptr, typename... Args>
struct TypeOverload
{
using type = decltype((std::declval<T>().*ptr)(std::declval<Args>() ...)) (T::*)(Args ...);
};
,你會按如下方式使用它:
using bar_t = TypeOverload<Foo, &Foo::bar, int, int>::type;
static_assert(std::is_same<bar_t, void(Foo::*)(int,int)>::value, "");
demo
不完全符合您的要求,但會像[this](http://coliru.stacked-crooked.com/a/0197cd774882606c)滿足您的需求? – TartanLlama
@TartanLlama不,因爲這不適用於重載的方法 –