(这里的根本问题是我正在尝试使用decltype或者某些其他类型的演绎可能基于auto涉及lambdas的复杂表达式.我正在尝试找到某种解决方法.我一直在玩http: //pfultz2.github.com/Pythy/ for polymorphic lambdas.如果没有告诉你一个长篇故事,我就无法充分发挥其动力!)
我希望能够decltype([](int){return 3.5L};获得lambda的类型,或者至少返回类型.是的,我知道lambdas有一个独特的类型,我不需要提醒,decltype([](int){return 3.5L};如果在两个不同的行上使用它将提供两种不同的类型.
如果我decltype在lambda上使用,那么我会得到一条错误消息('lambda在未评估的上下文中使用').我知道这似乎是一个合理的错误信息,但我很惊讶C++握着那样的手!允许这样做是有用的,特别是访问lambda的返回类型.这个错误只是过度出错的错误消息的结果,还是真的有一个很好的理由为什么它不能完成?
像这样的表达式在成员函数内部起作用:
template<typename T>
struct X {
void foo() {
static auto l = [](int){return 3.5;};
}
};
Run Code Online (Sandbox Code Playgroud)
但我不允许这样做:
template<typename T>
struct X {
static auto var = [](int){return 3.5;}; // will also fail if I use constexpr here
};
x.cpp:8:47: error: expression ‘#‘lambda_expr’ not supported by
dump_expr#<expression error>’ is not a constant-expression
x.cpp:8:47: error: unable to deduce ‘const auto’ from ‘<expression error>’
Run Code Online (Sandbox Code Playgroud)
这激发了我的想法,试图在函数中使用静态变量,以便对lambda进行类型推断.
如果X不是模板,这看起来好一点.但我需要X作为模板 - 特别是,lambda的参数将采用模板参数的类型.
记住,我只想要lambda的类型,我只对返回类型感到满意.令人沮丧的是,编译器愿意并且能够在两种情况下进行类型推断和静态初始化,但它似乎在我的方式中设置了一些任意障碍.
我可以从函数外部访问变量的类型吗?var_in_funcdummy_func
struct S {
constexpr static auto member = a_complicated_expression... // error
void dummy_func() {
static auto var_in_func = a_complicated_expression... // OK
}
typedef dummy_func :: var_in_func the_type; // I'd like this to work
};
Run Code Online (Sandbox Code Playgroud)
如果有lambdas a_complicated_expression...,则初始化程序通常会出现问题member.如果S实际上是一个struct模板,那么我会得到member没有初始化器的错误消息.这就是我试图找到其他方法的原因.
但是,static auto静态方法中的变量dummy_func工作正常.这让我觉得他们应该是一个很好的方式来访问该静态变量的类型?
我尝试了以下但是它没有用,因为dummy_func它不是一种类型(足够公平):
typedef dummy_fun :: var_in_func the_type_of_the_static_variable_in_the_method;
Run Code Online (Sandbox Code Playgroud)
我不能这样做,decltype( a_complicated_expression... )因为编译器抱怨在未评估的上下文中使用lambda(一个declspec).
我正在使用g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3.我不介意我是否必须使用g ++特定扩展.
lambda 函数仅在其作用域的上下文中定义。这意味着静态成员函数中的 lambda 函数的类型与其他地方定义的类型不同。在我看来,获取 lambda 函数在其范围之外的返回类型是不明智的,也不应该是可能的。
必须有另一种方法(不涉及 lambda)来获取所需的类型,因为在任何潜在 lambda 函数的范围之外定义此类类型显然是有意义的。
| 归档时间: |
|
| 查看次数: |
386 次 |
| 最近记录: |