C++ 模板笔记

                     

贡献者: addis

  • 本文处于草稿阶段。

   对整型模板参数循环(C++ 17):

#include <iostream>
template<int Start, int Step, int End>
void constexprLoop() {
    if constexpr (Start < End) {
		// ==== 循环体 ====
        cout << Start << endl;
		// ===============
        constexprLoop<Start + Step, Step, End>();
    }
}
int main() {
    constexprLoop<0, 2, 6>();
    return 0;
}
不会有任何性能损失,cout 大概率会被 inline。

   更直接的,还可以用 constexpr 函数

constexpr int factorial(int n) {
    int result = 1;
    for (int i = 2; i <= n; ++i) {
        result *= i;
    }
    return result;
}
但是别高兴得太早,这个函数要求能 100% 在编译时执行(虽然运行时也能执行,但输出就不是 constexpr 了)。所以别想用它来给 tuple 写一个循环。

   另见 SLISC 中如何实现 std::hash<tuple<...>>

1. Template Function Overloading

   【这里的笔记过时了,用 SFINAE 就好】 在普通的 function overloading 的基础上:

Meta programming

2. variadic template

   variadic template lambda

template<typename Func, typename... Args>
auto callGenericLambda(Func&& func, Args&&... args) -> decltype(auto) {
    return func(std::forward<Args>(args)...);
}

int main() {
    auto lambda = [](auto&&... args) {
        // A fold expression to print all arguments.
        ((std::cout << args << ' '), ...);
    };

    callGenericLambda(lambda, 42, "Hello", 3.14);
}


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利