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