中断MSVC2015 SFINAE代码以匹配静态成员函数签名

时间:2017-05-18 01:10:32

标签: c++ c++11 visual-studio-2015 static-methods sfinae

我遇到了一个似乎特定于MSVC2015的错误,我非常好奇为什么它似乎失败了。我还提交了这个针对VS 2015的错误报告,但我认为了解更多信息会很有趣。值得注意的是,这在我尝试过的所有其他编译器中都能很好地工作,包括MSVC2013和MSVC2017。

目的非常简单 - 我正在检查类型T是否有一个名为New的静态成员函数,它接受一些参数(对于有多个重载的情况下消除歧义很重要)

相对较少的复制:

namespace {
  class MyPrivateCtorStringClass :
    public CoreObject
  {
    MyPrivateCtorStringClass(void) :
      istr("default_string")
    {}
    MyPrivateCtorStringClass(const char* istr) :
      istr(istr)
    {}

  public:
    const char* istr;

    static MyPrivateCtorStringClass* New(const char* str) {
      return new MyPrivateCtorStringClass{ str };
    }
  };
}

template<typename T, typename... Args>
struct deducer
{
  template<class U>
  static std::true_type select(decltype(U::New((Args&&)*(Args*)nullptr...))*);

  template<class U>
  static std::false_type select(...);

  static const bool value = decltype(select<T>(nullptr))::value;
};

static_assert(
  deducer<MyPrivateCtorStringClass, decltype("")>::value,
  "PrivateString Static New was not detected"
);

0 个答案:

没有答案