Хотя я не могу понять, каков ваш компилятор, следующий код может быть скомпилирован VC8, ideone (gcc-4.3.4) и Comeau online:
struct A { int i; };
template< size_t > struct S;
int main() {
S< offsetof( A, i ) > *p;
}
Gcc имеет __offsetof__
расширение.VC, похоже, обладает способностью принимать константу времени некомпиляции для аргумента шаблона странным образом.Что касается Comeau, я, к сожалению, понятия не имею о внутреннем из offsetof
Comeau.
Между прочим, хотя это не ответит на ваш вопрос напрямую, как для цели 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;
}
Надеюсь, это поможет.