Lor*_*one 1 c++ static typedef
有没有办法让这个代码工作,就像用点符号调用静态函数时一样?
struct A{
static void f(){ }
typedef int t;
};
template<typename T> void f(){}
int main(){
A a;
a.f(); //legit
f<a.t>(); //‘a’ cannot appear in a constant-expression, ‘.’ cannot appear in a constant-expression
a.t somevar; //invalid use of ‘A::t’
f<a::t>(); //‘a’ cannot appear in a constant-expression
a::t somevar; //‘a’ is not a class, namespace, or enumeration
}
Run Code Online (Sandbox Code Playgroud)
编辑:伙计们,请在发布之前阅读问题并测试您的代码.这里的要点是不使用A::t
,但"援引" t
通过一个实例的A
,就像你可以用静态方法做.
你必须使用A::t
而不是a.t
因为typedef是static
和a
它的实例A
.
编辑:与我上面所说的相反,它并不总是"喜欢static
".对于静态成员,有以下特殊规则:
可以使用qualified-id表达式X :: s来引用类X的静态成员; 没有必要使用类成员访问语法(5.2.5)来引用静态成员.可以使用类成员访问语法来引用静态成员,在这种情况下,评估对象表达式.[例如:
Run Code Online (Sandbox Code Playgroud)struct process { static void reschedule(); }; process& g(); void f() { process::reschedule(); // OK: no object necessary g().reschedule(); // g() is called }
因为typedef
是不是一个静态成员,这个语法是无效的.
鉴于实例a
而不是这种语法糖,获得t
它的唯一方法是获得它的类型.C++ 11为我们提供了一个工具:
typedef decltype(a) a_type;
f<a_type::t>();
a_type::t somevar;
Run Code Online (Sandbox Code Playgroud)
但是,我认为它没有实际用途(好吧,也许在宏中,但每个人都知道模板更好).