我在工作中正在尝试一些方法来使我们的代码库更具反思性。基本上,我想达到的目标是,在数据成员的初始化器类型内捕获指向数据成员的指针:
template<class Class, int Class::*dataMember>
struct Reflect
{
operator int() {return 0;}
};
class Foo
{
public:
int bar = Reflect<Foo, &Foo::bar>{};
};
尽管clang 3.4.1 (http://gcc.godbolt.org/)和Intel C++ XE 14.0可以编译此代码片段,但使用MSVC12时会出现以下错误信息:
此外,gcc 4.9.2似乎也有问题:http://ideone.com/ZUVOMO。error C2065: 'bar' : 未声明的标识符
error C2975: 'dataMember' : 'Reflect'的无效模板参数,预期为编译时常量表达式
所以我的问题是:
- 上述代码片段是否有效的C ++11?
- 如果是,是否有任何解决编译器失败的方法?
int a=b<c,d=e>::f;
可以声明成员a
并将其初始化为b<c,d=e>::f
,也可以声明成员a
初始化为b<c
,并且成员d
初始化为e>::f
。这还受到 NSDMI 可能引用类的尚未声明的成员的复杂性的影响。 - user743382d=e
不能是一个有效的模板参数。然而,这是一个从解析器开始的语法问题,不是吗? - Columbo