• hello world
    2020-01-09
    compose那是完全没看懂唉,还有sequence那...

    作者回复: 给个提示,到下面这个网站上看看模板是如何展开的:

    https://cppinsights.io/

    
     1
  • 三味
    2020-01-10
    17和18讲可以说,真是劝退不少非c++读者吧。。。
    个人认为,如果不是需要写库,这两节的内容应该用得也不多吧。
    作为一名图形工作者,我看这些东西,其实是因为好多图形库(说的就是你,CGAL)都是模板代码,看得眼疼。。。
    实用更优先。当然,理解这些这几讲的内容还是很有帮助的。
    顺便说一句,留言区贴代码实在是太费劲了。。。极客时间不好好搞搞Markdown回复格式么?好多问题还要贴代码的,有的就是挺长的。。
    试着回答一下问题:
    1. compose不带任何参数,
    template<class... Args>
    auto compose() {
        return [](auto&&... args) { return compose<Args...>(); };
    }
    关于不带参数的意义,我理解的是,没有参数,那么就没有要执行的操作,那么就什么都不执行,返回个空。再深挖掘我就想不到了。。。这里我是为了形式上的统一,返回了一个依然什么都不做的自身。

    2. 想不到其他方法。。要再预编译阶段就展开256个数值。。我还是等等答案吧。。

    3. 自己实现是不可能的。这辈子都不可能。之前我看别人的代码,有通过借助写了一个辅助的PushBack操作来实现。这个自然不是我原创,拿来主义:
    template <class T, T... Ints>
    struct integer_sequence {};

    template <size_t... Ints>
    using index_sequence = integer_sequence<size_t, Ints...>;

    template <size_t, typename T>
    struct push_back{};

    template <size_t N, size_t... Ints>
    struct push_back<N, index_sequence<Ints...>> {
        using type = index_sequence<Ints..., N>;
    };

    template <size_t N>
    struct index_sequence_helper {
        using type = typename push_back<N-1, typename index_sequence_helper<N-1>::type>::type;
    };

    template <>
    struct index_sequence_helper<1> {
        using type = index_sequence<0>;
    };

    template <size_t N>
    using make_index_sequence = typename index_sequence_helper<N>::type;
    展开

    作者回复: 如果极客时间要支持留言用 Markdown,恐怕也得是可选的,否则有些不用 Markdown 的就要晕菜了……倒是长度限制有点妨碍贴代码。

    1. 代码对。

    意义回头我再说。别人的代码我就不评价了。反正这个最后我会贴个参考答案。

    
    
  • 罗乾林
    2020-01-07
    1、看了老师的nvwa:
    inline auto compose()
    {
        return [](auto&& x) -> decltype(auto)
        {
            return std::forward<decltype(x)>(x);
        };
    }

    感觉还是为了使用方便,真的需要还可以这样:compose(std::identity{})

    第3题在网上查了些资料,发现很复杂。

    本节的思考题都好难,求老师解答。
    展开

    作者回复: 呃,compose() 返回的正是 identity(C++20 才有)啊。😉

    这讲的题目都会有个参考答案的。我会最后公布。

    
    
  • 禾桃
    2020-01-07
    template <typename F>
    auto compose(F f)
    {
        return [f](auto&&... x) {
            return f(x...);
        };
    }

    貌似用compiler(gcc version 4.8.5 20150623) 就会遇到下面编译错误
    // In function ‘auto compose(F)’:
    // error: expansion pattern ‘auto&&’ contains no argument packs
    // return [f](auto&&... x) {

    用compiler(gcc version 8.3.1 20190311)就不会有问题。

    如果公司目前只允许用(gcc version 4.8.5 20150623),请问有什么workaround?

    谢谢!
    展开

    作者回复: --- 更新 ---

    我费了九牛二虎之力,终于把例子改得能在 gcc 4.8 下工作了。我觉得你不想维护这样的代码的。

    这儿空间不够。我放在这里:

    http://wyw.dcweb.cn/download.asp?path=&file=jike_18_gcc48.cpp

    我觉得升级 GCC 绝对是更好的主意。

    --- 原回复 ---
    没啥好办法……泛型lambda至少要求gcc 4.9。只能不用这类功能了。

    手写一个函数对象模板也许可以完成这个功能(让 f 成为其数据成员)。你可以试试看。我暂时没时间试验。

    
    
  • 禾桃
    2020-01-07
    #1
    template <typename F,
              typename... Args>
    auto compose(F f, Args... args)
    {
      return [f, args...]() {
        return f(
          compose(args...)());
      };
    }


    template <typename F>
    auto compose(F f)
    {
        return f;
    }

    如果这些函数都在函数体内操作一个公用的数据,而且这些函数依次执行的顺序反应了一定的工程需求,那么就是有意义的吧。
    展开

    作者回复: 你这个compose带参数了呀……

    
    
  • 李亮亮
    2020-01-06
    N-->(N-1, N-1)-->(N-2, N-2, N-1)-->(1, 1 , 2 ....N-1)-->(0, 0, 1, 2...N-1)

    作者回复: 😁 学得挺快。

    
    
我们在线,来聊聊吧