gpt4 book ai didi

c++ - 是否可以访问另一个函数中定义的自动静态变量的 *type* ?

转载 作者:可可西里 更新时间:2023-11-01 18:39:42 26 4
gpt4 key购买 nike

(这里的根本问题是我正在尝试对涉及 lambda 的复杂表达式使用 decltype 或可能基于 auto 的其他类型推导。我正在尝试寻找某种解决方法。我一直在研究 http://pfultz2.github.com/Pythy/ 的多态 lambda。如果不告诉大家一个长篇故事,我无法完全进入动机!)

我希望能够做到decltype([](int){return 3.5L};获取 lambda 的类型,或者至少是返回类型。是的,我知道 lambda 有一个独特的类型,我不需要被提醒 decltype([](int){return 3.5L};如果在两条不同的线上使用,将给出两种不同的类型。

如果我使用 decltype在 lambda 上,然后我收到一条错误消息(“lambda used in unevaluated context”)。我知道这似乎是一条合理的错误消息,但令我惊讶的是 C++ 会那样握着我的手!允许这样做会很有用,特别是访问 lambda 的返回类型。此错误仅仅是由于过分热心的错误消息造成的,还是确实有充分的理由无法完成?

像这样的表达式在成员函数中起作用:

template<typename T>
struct X {
void foo() {
static auto l = [](int){return 3.5;};
}
};

但我不允许这样做:

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>’

这激发了我尝试在函数中使用静态变量以便对 lambda 进行类型推断的想法。

如果 X 不是模板,这似乎工作得更好一些。但我需要 X 作为模板——特别是,lambda 的参数将采用模板参数的类型。

请记住,我只需要 lambda 的类型,并且只对返回类型感到满意。令人沮丧的是,编译器愿意并且能够在这两种情况下进行类型推断和静态初始化,但它似乎在我的道路上设置了一些任意的障碍。

我可以访问变量的类型var_in_func来自dummy_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
};

如果 a_complicated_expression... 中有 lambda , member 的初始值设定项通常有问题.如果S实际上是一个结构模板,然后我收到错误消息 member没有初始化器。这就是为什么我试图找到解决这个问题的其他方法。

然而,static auto静态方法中的变量 dummy_func工作正常。所以这让我想到它们应该是访问该静态变量类型的好方法?

我尝试了以下但没有成功,因为 dummy_func不是一种类型(足够公平):

typedef dummy_fun :: var_in_func the_type_of_the_static_variable_in_the_method;

我做不到decltype( a_complicated_expression... )因为编译器提示在未计算的上下文(declspec)中使用 lambda。

我正在使用 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 .我不介意是否必须使用特定于 g++ 的扩展。

最佳答案

非捕获 lambda 可以转换为函数指针,并具有带有该函数指针签名的 operator():

template<typename C, typename R, typename... Args>
auto remove_class(R (C::*)(Args...)) -> R(*)(Args...);
template<typename C, typename R, typename... Args>
auto remove_class(R (C::*)(Args...) const) -> R(*)(Args...);
template<typename C, typename R, typename... Args>
auto remove_class(R (C::*)(Args...) volatile) -> R(*)(Args...);
template<typename C, typename R, typename... Args>
auto remove_class(R (C::*)(Args...) const volatile) -> R(*)(Args...);

template<typename T>
auto to_f_ptr(T t) -> decltype(remove_class(&T::operator())) { return t; }

您现在可以编写 auto var = to_f_ptr([](int){return 3.5;}); 并且 var 的类型为 double (*) (int).

但是,您仍然不能将 lambda 用作类作用域 static 初始化器;见lambda as a static member .

关于c++ - 是否可以访问另一个函数中定义的自动静态变量的 *type* ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com