什么情况下应该使用auto类型?
In whats case should use auto type?
我有一些关于何时使用的问题auto
- 说清楚了,看上下文是不是更清楚了?
- 最好是明确的案例而不是
auto
?
并且使用 lambda 函数 auto
如何使用这些
auto f = [](auto v, auto x) {};
//or
std::function<void(auto v, auto x)> f;
谢谢...
就个人而言,我倾向于将 auto
用于 select 几种类型的代码:
无法表达的类型,例如由 lambdas 创建的类型:
auto f = []() { /* some code */ };
迭代器,因为它们都实现了相同的不透明接口。我不在乎它是什么特定类型的迭代器,只是它的行为像一个。
auto it = m.find(key);
if(it != m.end() {
/* some code */
}
如果类型已经在同一行上说了,例如强制转换:
float f = 123.456;
/* some code */
auto n = static_cast<int>(f);
或类似的:
if(auto p = dynamic_cast<Derived *>(base_ptr)) {
/* some code here */
}
对于其他一切,我会倾向于直截了当。
关于 std::function
与 auto
,我会尽可能使用 auto
,然后根据需要回退到 std::function
。这是因为 std::function
有轻微的开销,因为它是使用类型擦除技术实现的。
这通常意味着我将在合理的情况下使用模板来实现接受 "callable thing" 的函数。
也就是说,如果我需要存储一个函数,可能会传递它,那么 std::function
非常适合。
我有一些关于何时使用的问题auto
- 说清楚了,看上下文是不是更清楚了?
- 最好是明确的案例而不是
auto
?
并且使用 lambda 函数 auto
如何使用这些
auto f = [](auto v, auto x) {};
//or
std::function<void(auto v, auto x)> f;
谢谢...
就个人而言,我倾向于将 auto
用于 select 几种类型的代码:
无法表达的类型,例如由 lambdas 创建的类型:
auto f = []() { /* some code */ };
迭代器,因为它们都实现了相同的不透明接口。我不在乎它是什么特定类型的迭代器,只是它的行为像一个。
auto it = m.find(key); if(it != m.end() { /* some code */ }
如果类型已经在同一行上说了,例如强制转换:
float f = 123.456; /* some code */ auto n = static_cast<int>(f);
或类似的:
if(auto p = dynamic_cast<Derived *>(base_ptr)) { /* some code here */ }
对于其他一切,我会倾向于直截了当。
关于 std::function
与 auto
,我会尽可能使用 auto
,然后根据需要回退到 std::function
。这是因为 std::function
有轻微的开销,因为它是使用类型擦除技术实现的。
这通常意味着我将在合理的情况下使用模板来实现接受 "callable thing" 的函数。
也就是说,如果我需要存储一个函数,可能会传递它,那么 std::function
非常适合。