一个元函数对c ++中另一个元函数的副作用?

时间:2017-08-07 10:18:07

标签: c++ templates visual-c++

昨天我遇到了一个问题,我的元函数没有像预期的那样工作。 然后我评论了所有(看似)不相关的代码来找到问题。它起作用了。

这是我的代码完整代码

#include <iostream>
#include <type_traits>

template <typename...> struct make_void { using type = void; };

template <typename... Ts> using void_t = typename make_void<Ts...>::type;

template <typename Functor, typename = void>
struct is_functor : std::false_type {};

template <typename Functor>
struct is_functor<Functor, void_t<decltype(&Functor::operator())>>
    : std::true_type {};

template <typename Callable,
          typename Signature = decltype(&Callable::operator())>
struct ExtractCallableRunTypeImpl;

template <typename Callable, typename R, typename... Args>
struct ExtractCallableRunTypeImpl<Callable, R (Callable::*)(Args...) const> {
  using Type = R(Args...);
};

template <typename Callable>
using ExtractCallableRunType =
    typename ExtractCallableRunTypeImpl<Callable>::Type;

template <typename Functor, typename SFINAE = void>
struct IsConvertibleToRunType : std::false_type {};

template <typename Callable>
struct IsConvertibleToRunType<Callable, void_t<decltype(&Callable::operator())>>
    : std::is_convertible<Callable, ExtractCallableRunType<Callable> *> {};


int main() {
  auto f = []() {};
  std::cout << IsConvertibleToRunType<decltype(f)>::value << std::endl;

  return 0;
}

运行此代码将打印“0”。 在注释掉代码的以下部分后,它会显示我的预期行为并打印出“1”。

template <typename Functor, typename = void>
struct is_functor : std::false_type {};

template <typename Functor>
struct is_functor<Functor, void_t<decltype(&Functor::operator())>>
    : std::true_type {};

似乎与void_t的使用有某种关系,但坦率地说,无法解释为什么它对后面的代码有任何影响。根本不使用is_functor元函数。

此处演示http://rextester.com/JRQU76860 运行演示,然后注释掉代码的标记部分并再次运行。

你有什么想法吗?

0 个答案:

没有答案