标签: stdtuple

从std :: tuple <some_types ...>开始创建子元组

让我们假设std::tuple<some_types...>给出了一个.我想创建一个新std::tuple的类型是索引的类型[0, sizeof...(some_types) - 2].例如,让我们假设起始元组是std::tuple<int, double, bool>.我想获得一个定义为的子元组std::tuple<int, double>.

我对可变参数模板很新.作为第一步,我试着写一个struct负责存储不同类型的原始文件std::tuple,目的是创建一个同类的新元组(如std::tuple<decltype(old_tuple)> new_tuple).

template<typename... types>
struct type_list;

template<typename T, typename... types>
struct type_list<T, types...> : public type_list<types...>  {
    typedef T type;
};


template<typename T>
struct type_list<T> {
    typedef T type;
};
Run Code Online (Sandbox Code Playgroud)

我想做的是:

std::tuple<type_list<bool, double, int>::type...> new_tuple // this won't work
Run Code Online (Sandbox Code Playgroud)

下一步是丢弃参数包中的最后一个元素.如何访问type存储的几个type_list?以及如何丢弃其中一些?

谢谢.

c++ templates variadic-templates c++11 stdtuple

4
推荐指数
2
解决办法
2895
查看次数

在可变参数模板类的构造函数中初始化元组成员

假设我有一个变量的类:

class Variable
{
  const std::string name;
  const double scale;

public:
  Variable(const std::string& _name, double _scale) : name(_name), scale(_scale) { }
};
Run Code Online (Sandbox Code Playgroud)

现在我定义一个包含变量的系统类:

template<class... T>
class System
{
 std::tuple<T...> variables;

public:
 System(???) : ??? { }
};
Run Code Online (Sandbox Code Playgroud)

我如何定义 的构造函数System,它将以某种方式传递其参数来variables初始化它们中的每一个?我希望能够写出这样的东西:

class VAR1 : public Variable { };
class VAR2 : public Variable { };

System<VAR1, VAR2> s{ /* init values: ("VAR1", 10), ("VAR2", 20) */};
Run Code Online (Sandbox Code Playgroud)

c++ templates stdtuple

4
推荐指数
1
解决办法
2024
查看次数

结构化绑定实现地下和 std::tuple

这是真的,即结构化绑定clang(我用最近建造clang version 4.0.0 (trunk 282683))用一些东西来实现<tuple>,如括号,初始化列表可以使用的东西从<initializer_list>

我编写了简单的代码只是为了使用一些最新的功能

struct S { int a; char b; double c; };
auto [a, b, c] = S{1, '2', 3.0};
using A = decltype(a);
using A = int;
using B = decltype(b);
using B = char;
using C = decltype(c);
using C = double;
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,但是当我const之前添加限定符时auto

struct S { int a; char b; double c; };
const auto [a, b, c] …
Run Code Online (Sandbox Code Playgroud)

c++ clang stdtuple c++17 structured-bindings

4
推荐指数
1
解决办法
489
查看次数

C++ 将同构包装类型的元组转换为原始类型的元组

我想调用std::apply()一个函数;但是,我无法使用,因为std::tuple我使用的当前已包装。例如:

#include <tuple>

template <class T>
struct wrapped
{
    wrapped(T t) : t(t) {}

    T t;
};

template <class T, class ... Args>
struct delay_call
{
    T(*callback)(Args...);
    std::tuple<Args...> params;

    delay_call(T(*callback)(Args...), Args ... params) :
        callback(callback), params(params...)
    {}

    T call()
    {
        return std::apply(callback, params);
    }
};

template <class T, class ... Args>
struct delay_call_with_wrap
{
    T(*callback)(Args...);
    std::tuple<wrapped<Args>...> w_params;

    delay_call_with_wrap(T(*callback)(Args...), wrapped<Args> ... w_params) :
        callback(callback), w_params(w_params...)
    {}

    T call()
    {
        std::tuple<Args...> params; // = w_params.t
        return std::apply(callback, actual_params); …
Run Code Online (Sandbox Code Playgroud)

c++ wrapper variadic-templates stdtuple c++17

4
推荐指数
1
解决办法
512
查看次数

std::tuple 可以在编译时/运行时根据其值进行排序吗

我想知道是否constexpr std::tuple可以在编译时对a进行排序:

template<typename T>
struct A{ T val; }; // a constexpr-enabled class

constexpr auto t = std::make_tuple( A<int>{3}, A<float>{1.f}, A<double>{2.0});
constexpr auto s = sort(t, [](auto&& v){return v.val; });

static_assert(std::is_same_v<std::tuple<A<float>,
                                        A<double>, 
                                        A<int>>,decltype(s)>, "Wups");
Run Code Online (Sandbox Code Playgroud)

这可能吗,这里需要哪些构建块(std::sortconstexpr)?

(据我所知)在运行时不可能做到这一点,因为在运行时无法确定排序元组的类型。如果构建所有排列的类型映射,我也看不到一种方法,实际排列仍然只在运行时才知道。

回答/sf/answers/3220421851/ 给出了一些提示,它应该在编译时工作,但是如何?

c++ sorting constexpr stdtuple c++20

4
推荐指数
1
解决办法
189
查看次数

C++ 将 std::tuple&lt;char, char, char&gt; 转换为 std::string?

我正在编写一个轻量级解析器组合库(类似于 Boost::Spirit)作为业余项目。

有一件事我想要做的,是自动能够转换Result<std::tuple<char>>Result<std::tuple<char, char>>等成std::string

同样,如果有例如 aResult<std::tuple<int, int>>我希望能够将其转换为 aResult<std::vector<int>>或更一般地对于包含零个或多个相同类型元素的任何元组,T我希望能够将其自动转换为 a Result<Container<T>>

一个人如何处理这样的事情?我尝试例如:

  template<typename Container>
  Result<decltype(std::make_from_tuple<Container>(std::declval<T>()))> () const {
      Result{Container{std::make_from_tuple<std::initializer_list<typename std::tuple_element<0, T>::type>> (std::get<T>(*this))}};
  }

Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为事实证明不可能像这样以编程方式创建初始化列表。

c++ conversion-operator template-meta-programming stdtuple c++17

4
推荐指数
1
解决办法
64
查看次数

C++ std::tuple&lt;Ts...&gt; 到 std::tuple&lt;std::vector&lt;T&gt;...&gt;&gt;

给定一个可变参数模板,我想定义一个对象,该对象是可变参数模板中每种类型的向量元组。

就像是:

template <typename... Ts>
class C {    
   std::tuple<std::vector<T1>, std::vector<T2>,...,std::vector<Tn>> vectors;
};
Run Code Online (Sandbox Code Playgroud)

它不一定是一个数据成员,我的意思是,如果可以使用更多辅助类型或对象来完成此操作,那将不是问题。

std::make_index_sequence我尝试了与的组合std::tuple,但我无法弄清楚。

c++ metaprogramming template-meta-programming variadic-templates stdtuple

4
推荐指数
2
解决办法
118
查看次数

通过函数中的编译时间变量访问C ++ 11中的元组元素

以下最小示例使用编译g++ -std=c++11 -Wall tuple.cpp -o tuple

#include <tuple>
#include <iostream>

template<int i>
char get_elem_i(std::tuple<char, char> t)
{
    return std::get<i>(t);
}

int main()
{
    std::tuple<char, char> t('H','i');
    char c = get_elem_i<0>(t);
    std::cout << "The char is: " << c << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

现在,我不想使用指定索引的模板(确切的原因:我拥有自动推断的模板,并且我不想全部指定它们)。所以我的第一次尝试是:

char get_elem_i(int i, std::tuple<char, char> t)
{
    return std::get<i>(t);
}
Run Code Online (Sandbox Code Playgroud)

我了解这无法编译。有什么方法可以确保在编译时i就可以知道编译器吗?也许是这样的吗?

char get_elem_i(compile_time_known int i, std::tuple<char, char> t)
Run Code Online (Sandbox Code Playgroud)

c++ c++11 stdtuple

3
推荐指数
1
解决办法
8811
查看次数

std :: array编译时间扣除

我有一段代码,我尝试在给定等待数据类型的情况下自动解码缓冲区.数据表示为元组:

std::tuple<uint8_t, int32_t> data;
size_t bufferIndex;
IOBuffer::ConstSPtr buffer( std::make_shared<IOBuffer>(5) );
Run Code Online (Sandbox Code Playgroud)

我也有元组heplers迭代元组并为每个元素执行一个仿函数:

//-------------------------------------------------------------------------
//
template <typename Function, typename ...Tuples, typename ...Args>
void IterateOverTuple( Function& f, std::tuple<Tuples...>& t,
                       Args&... args )
{
    impl::IterateOverTupleImpl<0, sizeof...(Tuples),
        std::tuple<Tuples...>>()( f, t, args... );
}
//---------------------------------------------------------------------
//
template <int I, size_t TSize, typename Tuple>
struct IterateOverTupleImpl
    : public IterateOverTupleImpl<I + 1, TSize, Tuple>
{
    template <typename Function, typename ...Args>
    void operator()( Function& f, Tuple& t, Args&... args )
    {
        f( std::get<I>(t), args... );
        IterateOverTupleImpl<I + 1, TSize, …
Run Code Online (Sandbox Code Playgroud)

c++ compile-time stdtuple

3
推荐指数
1
解决办法
395
查看次数

在C ++ 11中定义元组常量向量的更简洁方法

我有一个恒定的元组向量,其中每个元组都包含一个键,名称,数量,值。这就是我的定义方式-

// tuple of key, name, quantity, value
const std::vector<std::tuple<unsigned char, std::string, unsigned char, float> > myTable{
    std::tuple<unsigned char, std::string, unsigned char, float>(0, "mango", 12, 1.01f),
    std::tuple<unsigned char, std::string, unsigned char, float>(4, "apple", 101, 22.02f),
    std::tuple<unsigned char, std::string, unsigned char, float>(21, "orange", 179, 39.03f),
};
Run Code Online (Sandbox Code Playgroud)

在main函数中,我需要每个元组的索引和所有值进行处理。为简单起见,我使用以下方式打印它们:

for (int index = 0; index < myTable.size(); index++) {
    auto key = std::get<0>(myTable[index]);
    auto name = std::get<1>(myTable[index]);
    auto quantity = std::get<2>(myTable[index]);
    auto value = std::get<3>(myTable[index]);
    std::cout << " index: " << index
              << …
Run Code Online (Sandbox Code Playgroud)

c++ tuples vector c++11 stdtuple

3
推荐指数
1
解决办法
81
查看次数