C++ 模板导出向导能否调用constexpr函数?
我有自己的固定大小数组类型,我希望它可以从C++ 模板导出向导能否调用constexpr函数?,c++,c++17,constexpr,template-argument-deduction,C++,C++17,Constexpr,Template Argument Deduction,我有自己的固定大小数组类型,我希望它可以从std::initializer\u list构造而不必显式定义size模板参数 我想我可以使用一个模板推导指南,但它似乎没有将std::initializer\u list::size()作为它的constexpr函数 下面是一个尝试为std::array制作演绎指南的示例(它与我的类型类似,并且有相同的问题): 名称空间std { 模板数组(初始值设定项列表初始值设定项列表)->数组; } 静态constexpr std::array myArray
std::initializer\u list
构造而不必显式定义size模板参数
我想我可以使用一个模板推导指南,但它似乎没有将std::initializer\u list::size()
作为它的constexpr函数
下面是一个尝试为std::array
制作演绎指南的示例(它与我的类型类似,并且有相同的问题):
名称空间std
{
模板数组(初始值设定项列表初始值设定项列表)->数组;
}
静态constexpr std::array myArray={1,2,3};
静态constexpr std::数组myArray2={{1,2,3};
我在MSVC和Clang上试过,两者给出的错误大致相同:
myArray
有一个错误,抱怨函数的参数太多。
myArray2
说“替换失败[带T=int]:非类型模板参数不是常量表达式”
我尝试将constexpr
放在演绎指南或函数参数的前面,但这两种方法都不允许,因此演绎指南似乎无效,即使它在constexpr
上下文中可以正常工作
有没有一种方法可以在不走
make_array()
路线的情况下实现此功能?参数/参数值不是constepr
您可以使用可变模板在编译时知道大小,或者使用已知大小(std::array
或C-array引用)键入
有没有一种方法可以在不走make_array()
路线的情况下实现这一点
你为什么不试试下面的扣除指南呢
template <typename T, std::size_t N>
array(T const (&)[N]) -> array<T, N>;
模板
数组(T常量(&)[N])->数组;
这样,myArray2={{1,2,3}}
中的参数就不会被解释为std::initializer_list
(as参数不能被视为constexpr
,因此它的size()
不能用于模板参数),而是作为一个C样式的数组
因此可以推断,作为模板参数,类型和大小(T
和N
)以及大小(N
)可以用作模板参数。您可以执行以下操作:
template <class T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;
问题是函数参数不是constepr
对象,因此如果这些成员函数读取某种局部状态,则无法调用它们上的constepr
成员函数
template <class T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;
constexpr size_t plus_one(size_t i) { return i + 1; }
template <class T, class... U>
array(T, U...) -> array<T, plus_one(sizeof...(U))>;