我遇到了一个似乎特定于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"
);