C++ 使用推断类型声明类成员
我有一个使用类型推断的代码,如下所示:C++ 使用推断类型声明类成员,c++,C++,我有一个使用类型推断的代码,如下所示: template <typename... Ttypes> Tuple<Ttypes...> makeTuple(Ttypes... args) { Tuple<Ttypes...> result; fillTuple<0>(result, args...); return result; } struct A { static const auto t = makeTuple(1
template <typename... Ttypes>
Tuple<Ttypes...> makeTuple(Ttypes... args) {
Tuple<Ttypes...> result;
fillTuple<0>(result, args...);
return result;
}
struct A {
static const auto t = makeTuple(1,2,3,'c');
};
我得到:错误:“const Tuple”类型的静态数据成员的类内初始值设定项需要“constexpr”说明符static const auto Tuple=makeTuple(1,2,3,'c')代码>
如果我使用
struct A {
static const auto constexpr t = makeTuple(1,2,3,'c');
};
我得到错误:constexpr变量“tuple”必须由常量表达式初始化
此外,使用constexpr
对我来说并不好,因为我喜欢在元组中使用非文本类型
编译器使用-std=c++14发出铿锵声
有什么办法可以得到我想要的吗?大概是这样的:
struct A {
using TupleType = decltype(makeTuple(1,2,3,'c'));
static const TupleType t;
};
// In a .cpp file
const A::TupleType A::t = makeTuple(1,2,3,'c');
有点复杂,但避免重复:
struct A {
static auto MakeMyTuple() { return makeTuple(1,2,3,'c'); }
using TupleType = decltype(MakeMyTuple());
static const TupleType t;
};
// In a .cpp file
const A::TupleType A::t = A::MakeMyTuple();
通过这种方式,makeTuple
的参数都在一个地方。大致如下:
struct A {
using TupleType = decltype(makeTuple(1,2,3,'c'));
static const TupleType t;
};
// In a .cpp file
const A::TupleType A::t = makeTuple(1,2,3,'c');
有点复杂,但避免重复:
struct A {
static auto MakeMyTuple() { return makeTuple(1,2,3,'c'); }
using TupleType = decltype(MakeMyTuple());
static const TupleType t;
};
// In a .cpp file
const A::TupleType A::t = A::MakeMyTuple();
这样,makeTuple
的参数都在一个地方。您应该能够在不声明成员静态的情况下完成这项工作。
auto在初始化类型推断时非常有用。如果在初始化之前需要声明,则可以改用decltype
Geeksforgeks对decltype有很好的介绍。
#包括
#包括
#包括
使用名称空间std;
模板
元组生成元组(类型…类型)
{
返回元组();
}
//我使用这两个函数只是为了显示
//非constexpr函数可用于确定类型
int generateInt()
{
返回1;
}
char generateChar()
{
返回“a”;
}
结构A
{
decltype(makeTuple(generateInt(),generateChar())t;
A():t(makeTuple(1,'A'))
{
}
};
int main()
{
A A;
返回0;
}
您应该能够在不声明成员静态的情况下完成此操作。
auto在初始化类型推断时非常有用。如果在初始化之前需要声明,则可以改用decltype
Geeksforgeks对decltype有很好的介绍。
#包括
#包括
#包括
使用名称空间std;
模板
元组生成元组(类型…类型)
{
返回元组();
}
//我使用这两个函数只是为了显示
//非constexpr函数可用于确定类型
int generateInt()
{
返回1;
}
char generateChar()
{
返回“a”;
}
结构A
{
decltype(makeTuple(generateInt(),generateChar())t;
A():t(makeTuple(1,'A'))
{
}
};
int main()
{
A A;
返回0;
}
@walnut:我想说部分,因为缺少演绎部分。@walnut:我想说部分,因为缺少演绎部分。正如OP所说,OP不能使用constexpr函数,因为他使用的是C++14。OP不想在包装类中使用constexpr,这是不必要的。C++14也支持constexpr,这仍然会在makeTuple中没有constexpr的情况下编译。此外,变量t
没有标记static const
,这是OP想要的。“我想将结果封装到一个不是类模板的类中。唯一的方法,这是合理的,就是像这样将它作为一个静态常量成员“听起来OP的印象是需要静电干扰。无论哪种方式,都可以将其修改为静态。是的,静态常量
不是必需的,知道这也是一个选项很有用。非常感谢。正如OP所说,OP不能使用constexpr函数,因为他使用的是C++14。OP不想在包装类中使用constexpr,这是不必要的。C++14也支持constexpr,这仍然会在makeTuple中没有constexpr的情况下编译。此外,变量t
没有标记static const
,这是OP想要的。“我想将结果封装到一个不是类模板的类中。唯一的方法,这是合理的,就是像这样将它作为一个静态常量成员“听起来OP的印象是需要静电干扰。无论哪种方式,都可以将其修改为静态。是的,静态常量
不是必需的,知道这也是一个选项很有用。非常感谢。我正在尝试不重复的情况(第二个)-看起来不错,但不起作用:错误:带有推断返回类型的函数“MakeMyTuple”在使用TupleType=decltype(MakeMyTuple())一行定义之前不能使用它
OK,在将MakeMyTuple
移动到基类并删除const
限定符之后,我得到了如下工作解决方案:struct TupledBase{static auto MakeMyTuple(){return makeTuple(1,2,3,'c');};struct tuple:TupledBase{使用TupleType=decltype(MakeMyTuple());静态TupleType t;};tuple::TupleType tuple::t=tuple::MakeMyTuple()
为了拥有静态常量TupleType t
-可以在decltype
之前添加常量,比如:使用TupleType=const decltype(MakeMyTuple())代码>甚至,您可以这样做:struct A{static const auto&t(){static const auto instance=std::make_tuple(1,2,3,'c');return instance;}代码>使用时只有额外的父级。我正在尝试不重复的情况(第二个)-看起来不错,但不起作用:错误:带有推断返回类型的函数“MakeMyTuple”在定义之前不能使用。
在using TupleType=decltype(MakeMyTuple())行中使用
OK,在将MakeMyTuple
移动到基类并删除const
限定符之后,我得到了如下工作解决方案:struct TupledBase{static auto MakeMyTuple(){return makeTuple(1,2,3,'c');};struct tuple:TupledBase{使用TupleType=decltype(MakeMyTuple());静态TupleType t;};tuple::TupleType tuple::t=tuple::MakeMyTuple()
为了拥有静态常量TupleType t
-可以在decltype
之前添加常量,比如:使用TupleType=const decltype(MakeMyTuple())代码>甚至,您可以这样做:struct