【发布时间】:2018-04-13 17:03:47
【问题描述】:
下面的代码在dp1“term 不计算为带 0 个参数的函数”的行上抱怨。我希望 dp1 会匹配 IsInstantiation 的特化 Dispatch,但它会出错。
如何更改此代码以使其按预期工作?我用的是VS2015,不能用std::invoke或std::is_invokable。
#include <type_traits>
template <typename>
class TemplateA {};
struct Callable
{
void operator()() {};
};
template <typename F, typename... Args>
constexpr auto Invoke(F &&f, Args &&... args)
{
return f(std::forward(args)...);
}
template <template<typename...> class TT, typename T>
struct IsInstantiation : std::false_type {};
template <template<typename...> class TT, typename... Ts>
struct IsInstantiation<TT, TT<Ts...>> : std::true_type {};
template <typename, typename = void>
struct HasNoArgs : std::false_type {};
template <typename T>
struct HasNoArgs<T, std::void_t<decltype(Invoke(T{}))>> : std::true_type {};
template <typename T1, typename = void>
class Dispatch;
template <typename T1>
class Dispatch<T1, std::enable_if_t<HasNoArgs<T1>::value>> {};
template <typename T1>
class Dispatch<T1, std::enable_if_t<IsInstantiation<TemplateA, T1>::value>> {};
int main(int argc, char *argv[])
{
Dispatch<TemplateA<int>> dp1;
Dispatch<Callable> dp2;
return 0;
}
【问题讨论】:
-
相关:在 C++11 中使用 INVOKE:stackoverflow.com/q/32918679/1896169
-
我将
HasNoArgs重命名为CanInvokeWithNoArgs,因为您要问两个问题,1. 我们可以为类型调用Invoke吗?和 2. 我们可以不带参数地做到这一点吗?