编译器如何计算模板函数?
How is a template function evaluated by a compiler?
考虑以下可变参数模板函数:
template<typename T, typename... Args>
auto foo(Args... args) -> T[sizeof...(args)]
{
T t[sizeof...(args)];
// Maybe do some pack expansion/assignment
return t;
}
使用实例化:
// total should be of type int[5];
auto total = foo(1,2,3,4,5);
我知道这不会编译,因为返回类型不可推导,但我不明白为什么它不可推导。
编译器在编译时是否知道此函数的某些内容,或者正在计算的函数各部分的顺序,从而防止类型推断?
我怀疑这是由于调用函数sizeof...
,我认为它在运行时进行评估。如果是这样,是否有编译时等效项?
不能按值返回内置数组。请改用std::array
。
此外,就目前而言,您需要显式提供类型T
作为模板参数,因为它不会出现在参数列表中。因此,编译器没有什么可以推断出来的。
完整示例:
#include <array>
template<typename T, typename... Args>
auto foo(Args... args) -> std::array<T, sizeof...(args)>
{
std::array<T, sizeof...(args)> t;
// Maybe do some pack expansion/assignment
return t;
}
int main () {
auto a = foo<int>(1,2,3);
}
根据用例的不同,您可以通过例如使用包中所有元素的std::common_type
或static_assert
它们都具有相同的类型并使用它来摆脱显式模板参数。
此外,为了记录,sizeof...
确实会产生一个编译时常量。问题是,为了使答案明确,编译器无法判断T
应该是什么。
编译器无法推断 T,因为您没有将 T 传递给函数参数。
auto total = foo<int>(1,2,3,4,5);
如果我们正确地手动将 T 作为模板参数 - 它将在 G++7.1 上编译并正常工作
或者,您可以简单地从可变参数中decltype
所需的类型。
像这样:
template <typename T, typename...Args>
T getHead(T&& arg, Args&&...) {
return arg;
}
template<typename... Args>
auto foo(Args... args)
{
using TYPE = typename std::decay<decltype(getHead(args...))>::type;
return std::array<TYPE, sizeof...(Args)>{ args... };
}
是的,使用 std::array,返回本地 C 样式数组是未定义的行为。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 函数计算用户按下按钮的频率
- C++ 在编译时具有函数计算全局变量
- C++ - 使用特定函数计算 x 和 y 的最终值
- 尝试使用函数计算有剩余球员的球队数量
- 我正在尝试创建一个布尔函数,该函数计算字符并在字符为"()*-+"时返回 true
- 哈希函数计算
- 为什么 if 语句对于运算符重载函数计算 false
- 使用C 中的内在函数计算相交
- 如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>
- vector.size() 函数计算量大吗?
- 如何使用opencv函数计算图像的孔数(二进制)
- 斐波那契函数计算不正确
- 如何用3个用户定义的函数计算一个数字的真平方根
- 元函数计算 x^n 并返回整数限制而不溢出(如果不可能)
- 使用递归函数计算字符串中的元音
- 如何使用 pow() 函数计算 C++ 中超过 2^32 的幂
- 返回 void 的函数的无序函数计算
- 在 C++ 中使用尾递归函数计算列表的总和
- 使用结构和函数计算线的长度