コンパイラが何であるかはわかりませんが、次のコードは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;
}
お役に立てれば。