类似 STL 对的三胞胎类 - 我自己滚

STL-pair-like triplet class - do I roll my own?

本文关键字:我自己 三胞胎 STL 类似      更新时间:2023-10-16

我想使用一个三重类,尽可能类似于std::p air。STL似乎没有。我不想使用太重的东西,比如 Boost。我能从某个地方举起一些有用的自由和开放源码软件非限制性许可证三重奏类吗?我应该自己滚吗?我应该完全做点别的事情吗?

编辑:关于std::tuple...

三胞胎特定的班级真的没有好处吗?我的意思是,对于元组,我做不到

template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;

现在我可以吗?我不必对单个类型组合三元组进行类型定义吗?

不,不要自己动手。相反,看看std::tuple - 这是std::pair的概括。所以这里有一个值初始化的 int s:

std::tuple<int, int, int> triple;

如果需要,可以仅具有三元组的类型别名:

template<typename T1, typename T2, typename T3>
using triple = std::tuple<T1, T2, T3>;

如果可以使用 C++11,请使用 std::tuple

如果没有,请使用 boost::tuple

如果您使用的是 C++11,则可以使用 std::tuple .

如果您使用的是 C++03,那么您要么需要求助于滚动自己的(这不太难),要么使用 Boost 中的tuple

我认为你需要这样的东西:

template<typename T>
struct triplet
{
    T first, middle, last;
};
template<typename T>
triplet<T> make_triplet(const T &m1, const T &m2, const T &m3) 
{
    triplet<T> ans;
    ans.first = m1;
    ans.middle = m2;
    ans.last = m3;
    return ans;
}

用法示例:

triplet<double> aaa;
aaa = make_triplet<double>(1.,2.,3.);
cout << aaa.first << " " << aaa.middle << " "  << aaa.last << endl;
triplet<bool> bbb = make_triplet<bool>(false,true,false);
cout << bbb.first << " " << bbb.middle << " "  << bbb.last << endl;

正在使用这个,它足以满足我的目的...但是,如果您想要不同的类型,只需进行一些修改:

template<typename T1, typename T2, typename T3>
struct triplet
{
    T1 first; 
    T2 middle;
    T3 last;
};
template<typename T1, typename T2, typename T3>
triplet<T1,T2,T3> make_triplet(const T1 &m1, const T2 &m2, const T3 &m3) 
{
    triplet<T1,T2,T3> ans;
    ans.first = m1;
    ans.middle = m2;
    ans.last = m3;
    return ans;
}

用法将非常相似:

triplet<bool,string,myDouble> ccc;
ccc = make_triplet<bool,string,double>(false,"AB",3.1415);
ccc.middle = "PI";
cout << ccc.first << " " << ccc.middle << " "  << ccc.last << endl;

要添加与 std::p air 的相似性方面,您可以定义一个具有第一、第二和第三的类。我的猜测是,在这种情况下,您无法避免创建 std::p air 的子类并添加"第三"成员。这是几行代码。

此外,如果你经常将这些东西与相同的类型一起使用,你也可以制作双胞胎和三胞胎类。使用 C++-11 的"使用"轻松制作,例如:

template <typename T> using twins = std::pair<T,T>;