有人可以解释“指数技巧”吗?

时间:2015-07-16 19:55:48

标签: c++ c++11 tuples variadic-templates indices

我注意到在精美打印元组的上下文中提到了“索引技巧”。这听起来很有意思,所以我跟着the link

嗯,那不顺利。我理解了这个问题,但实际上并不能跟踪发生的事情。为什么我们甚至需要任何指数?那里定义的不同功能如何帮助我们?什么是'裸露'?等

有人可以为参数包和可变元组的专家提供那个东西的播放吗?

1 个答案:

答案 0 :(得分:14)

问题是:我们有std::tuple<T1, T2, ...>我们有一些函数f我们可以调用每个元素,其中f返回int,我们想要将这些结果存储在数组中。

让我们从具体案例开始:

template <typename T> int f(T ) { return sizeof(T); }

std::tuple<int, char, double> tup{42, 'x', 3.14};
std::array<int, 3> arr{ f(std::get<0>(tup)), 
                        f(std::get<1>(tup)),
                        f(std::get<2>(tup)) );
除了写出所有get之外,所有这些index_sequence<0, 1, 2>都不方便且多余,最不容易出错。现在,假设我们有一个类型template <typename Tuple, size_t... Indices> std::array<int, sizeof...(Indices)> call_f_detail(Tuple& tuple, index_sequence<Indices...> ) { return { f(std::get<Indices>(tuple))... }; } 。我们可以使用它将该数组初始化折叠为可变参数包扩展:

f(std::get<Indices>(tuple))...

那是因为在函数中,f(std::get<0>(tuple)), f(std::get<1>(tuple)), f(std::get<2>(tuple))扩展为template <typename Tuple> std::array<int, std::tuple_size<Tuple>::value> call_f(Tuple& tuple) { return call_f_detail(tuple, // make the sequence type sequence<0, 1, 2, ..., N-1> std::make_index_sequence<std::tuple_size<Tuple>::value>{} ); } 。这正是我们想要的。

问题的最后一个细节就是生成特定的索引序列。 C ++ 14实际上为我们提供了一个名为make_index_sequence

的实用程序
Bare

而您链接的文章只是解释了如何实现这样的元功能。

template<typename T> using Bare = typename std::remove_cv<typename std::remove_reference<T>::type>::type; 可能来自Luc Danton's answer

    if(isset($_SESSION['logged']) && $_SESSION['logged'] == true)
            {

echo <<<END

               $("#I-like-it").click(function()
               {

                 $(this).css({"font-size": "20px" });


               });
               $("#I-dont-like-it").click(function()
               {

                  $(this).css({"font-size": "20px" });


               });
END;

            }
            else
            {

               echo 'alert("You must be logged in to vote!")';


            }