虽然我不知道你的编译器是什么,但下面的代码可以通过 VC8、ideone(gcc-4.3.4) 和 Comeau 在线编译:
struct A { int i; };
template< size_t > struct S;
int main() {
S< offsetof( A, i ) > *p;
}
Gcc 有__offsetof__
扩展名。VC 似乎有能力为模板参数采用非编译时常量。至于科莫,offsetof
不幸的是,我不知道科莫的内部情况。
顺便说一句,虽然这不会直接回答您的问题,但就 SFINAE 而言,由于成员指针常量可以用作模板参数并且您可以专注于它,您可以编写如下:
struct A {
int i, j;
};
template< int A::* > struct S;
template<> struct S< &A::i > { static char const value = 'i'; };
template<> struct S< &A::j > { static char const value = 'j'; };
int main() {
cout<< S< &A::i >::value <<endl;
cout<< S< &A::j >::value <<endl;
}
希望这可以帮助。