C++ 如何在使用SFINAE时忽略返回类型
我有一段代码:C++ 如何在使用SFINAE时忽略返回类型,c++,templates,visual-studio-2013,sfinae,C++,Templates,Visual Studio 2013,Sfinae,我有一段代码: template <typename T, typename R> struct is_dereferenceable_exact { typedef char yes; typedef struct { char dummy[2]; } no; template <typename U, R (U::*)() const> struct SFINAE; template <typename U>
template <typename T, typename R>
struct is_dereferenceable_exact
{
typedef char yes;
typedef struct { char dummy[2]; } no;
template <typename U, R (U::*)() const>
struct SFINAE;
template <typename U>
static yes test(SFINAE<U, &U::operator*>*);
template <typename U>
static no test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
模板
结构是可取消引用的
{
typedef char是;
typedef结构{char dummy[2];}否;
模板
结构SFINAE;
模板
静态是测试(SFINAE*);
模板
静态无试验(…);
静态常量布尔值=sizeof(测试(0))==sizeof(是);
};
此结构用于检查给定类型是否可取消引用,以及取消引用的结果是否具有类型R
。我使用了省略号和sizeof的好方法,而不是故意使用void\t,我只想使用C++-03特性(如果可能的话)
但我不能编写类似的结构,它只确定T::operator*
的存在,而忽略它的类型。你能帮我吗
UPD我可以概括我的问题:如果我可以使用返回类型编写一些trait,我如何像上面的入门中那样消除它们?也许你也可以使用sizeof操作符技巧:
#include <iostream>
template <typename T>
struct is_dereferenceable_exact
{
typedef char yes;
typedef struct { char dummy[2]; } no;
template <int>
struct SFINAE;
template <typename U>
static yes test(SFINAE<sizeof(&U::operator*)>*);
template <typename U>
static no test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
struct A {
int operator*() { return 0; }
};
struct B { };
int main() {
std::cout << is_dereferenceable_exact<A>::value << std::endl;
std::cout << is_dereferenceable_exact<B>::value << std::endl;
return 0;
}
#包括
模板
结构是可取消引用的
{
typedef char是;
typedef结构{char dummy[2];}否;
模板
结构SFINAE;
模板
静态是测试(SFINAE*);
模板
静态无试验(…);
静态常量布尔值=sizeof(测试(0))==sizeof(是);
};
结构A{
int运算符*(){return 0;}
};
结构B{};
int main(){
std::cout也许您还可以使用sizeof运算符技巧:
#include <iostream>
template <typename T>
struct is_dereferenceable_exact
{
typedef char yes;
typedef struct { char dummy[2]; } no;
template <int>
struct SFINAE;
template <typename U>
static yes test(SFINAE<sizeof(&U::operator*)>*);
template <typename U>
static no test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
struct A {
int operator*() { return 0; }
};
struct B { };
int main() {
std::cout << is_dereferenceable_exact<A>::value << std::endl;
std::cout << is_dereferenceable_exact<B>::value << std::endl;
return 0;
}
#包括
模板
结构是可取消引用的
{
typedef char是;
typedef结构{char dummy[2];}否;
模板
结构SFINAE;
模板
静态是测试(SFINAE*);
模板
静态无试验(…);
静态常量布尔值=sizeof(测试(0))==sizeof(是);
};
结构A{
int运算符*(){return 0;}
};
结构B{};
int main(){
std::不可能重复@ChrisBeck我不认为OP是在问如何编写是可引用的
特征,而是在问如何在不显式传递结果类型的情况下取消对成员函数的引用。@ChrisBeck的可能重复我不认为OP是在问如何编写是可引用的
特征,而是在问如何取消引用在不显式传递结果类型的情况下删除成员函数。谢谢,但不幸的是,它在VS 2013上不起作用(错误C2070:“重载函数”:操作数大小非法)另一个问题是,如果类同时具有操作符*
、常量和非常量两个版本,那么就我所知,我们不能选择操作符*
的重载版本,而模板替换由于不明确而退回到测试(…)
专门化(只需添加int操作符*()常数
至A
用于测试)@昆汀,据我所知,表达式SFINAE在VS中不支持:@MichaelGaluza我不知道我刚才做了什么来得出这样的结论:它起作用了……你是对的,在VS2015中也不起作用。我的错。@MichaelGaluza:我认为W.F.的答案在C++0x下是正确的,但如果你真正关心的是VS 2013,你可能想把这个问题标记为非常感谢,但不幸的是,它在VS 2013上不起作用(错误C2070:“重载函数”:操作数大小非法)另一个问题是,如果类同时具有操作符*
、常量和非常量两个版本,那么就我所知,我们不能选择操作符*
的重载版本,而模板替换由于不明确而退回到测试(…)
专门化(只需添加int操作符*()常数
至A
用于测试)@昆汀,据我所知,表达式SFINAE在VS中不支持:@MichaelGaluza我不知道我刚才做了什么来得出这样的结论:它起作用了……你是对的,在VS2015中也不起作用。我的错。@MichaelGaluza:我认为W.F.的答案在C++0x下是正确的,但如果你真正关心的是VS 2013,你可能想把这个问题标记为那个