小编j00*_*0hi的帖子

缓和函数的数学公式(ElasticEase,CircleEase,BounceEase,BackEase,PowerEase)?

我可以找出所有多项式函数的公式,例如QuinticEase的公式是:

(x - 1)^ 5 + 1

但是ElasticEase,CircleEase,BounceEase,BackEase或PowerEase的数学公式是什么?

它们都应该在0..1范围内

math wpf

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

如何在 Visual Studio 中查看模板编译器错误详细信息

我正在使用 Visual Studio 2015 并且我收到了很多编译器错误,但我无法弄清楚这些错误的根本原因是:

Visual Studio 中的编译器错误

双击突出显示的错误会将我带到list文件中operator==

template<class _Ty,
class _Alloc> inline
bool operator==(const list<_Ty, _Alloc>& _Left,
    const list<_Ty, _Alloc>& _Right)
{   // test for list equality
return (_Left.size() == _Right.size()
    && _STD equal(_Left.begin(), _Left.end(), _Right.begin()));
}
Run Code Online (Sandbox Code Playgroud)

嗯,这没有帮助。由于我正在处理一个庞大的项目,我不知道该错误的根本原因在哪里,即std::list以导致此错误的方式使用 的代码在哪里?

如果我没记错的话,我认为 XCode 会显示此类错误的堆栈。
我怎样才能找出这个错误的来源?

c++ templates compiler-errors visual-studio visual-studio-2015

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

从自身内部替换std :: function(通过将移动分配给* this?)

是否有可能将std::function自己内部的一个替换为另一个std::function

以下代码无法编译:

#include <iostream>
#include <functional>

int main()
{
    std::function<void()> func = []()
    {
        std::cout << "a\n";
        *this = std::move([]() { std::cout << "b\n"; });
    };
    func();
    func();
    func();
}
Run Code Online (Sandbox Code Playgroud)

可以对其进行修改以进行编译吗?
现在的错误消息是:此lambda函数未捕获“ this” -我完全理解。我不知道,但是,我怎么能抓住functhis终场。我想,这甚至不是std::function lambda里面了吗?如何才能做到这一点?

背景:我要实现的目标如下:在给定的第一次调用中std::function,我想做一些初始化工作,然后用优化的函数替换原始函数。我想为我的功能用户透明地实现这一目标。

上面的示例的预期输出为:

a
b
b

c++ this-pointer move-semantics c++11 std-function

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

使用 Vulkan 和 vkInvalidateMappedMemoryRanges 同步将内存从 GPU 传输到 CPU?

在 Vulkan 中,当我想将 GPU 的一些内存传输回 CPU 时,我认为最有效的方法是将数据写入具有标志的内存中VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT

问题 1:这个假设正确吗?

(可用内存属性标志的完整列表可以在VkMemoryPropertyFlagBits 的Vulkan 文档中找到

为了获取最新数据,我必须使用vkInvalidateMappedMemoryRanges使内存无效,对吗?

问题 2: 引擎盖下发生了vkInvalidateMappedMemoryRanges什么?这只是memcpy来自某个内部缓存还是可能是一个更长的过程?

问题 3:如果这可能需要更长的时间(即它不是一个简单的memcpy),那么我可能应该有一些可能与它的完成同步,对吗?但是,vkInvalidateMappedMemoryRanges不提供任何同步参数。实际上,我的问题是:如果我必须同步它,我该如何同步它?

vulkan

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

std :: array的部分模板参数推导或解决方法?

C++ 17允许我们std::array推导出模板参数.我可以写

std::array ints = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

并且ints将型的std::array<int, 3>.

我的问题是:如果我只想指定数组的类型参数但是自动确定数组的大小,该怎么办?

以下不起作用,因为似乎必须指定所有模板参数:

std::array<size_t> sizes = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

我的编译器抱怨并说:'std :: array':模板参数太少了.

是否可以通过模板参数推导自动确定数组的大小?如果没有,是否可以通过仅指定其类型而不是其大小来创建数组?

c++ templates stdarray c++17

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

使用代理对象延迟更新与“避免使用自定义构造和销毁的未命名对象”

我有一个类complicated,其中包含修改一些内部状态的各种设置器。内部状态修改可能很昂贵,所以我不想经常这样做。特别是,如果几个 setter 被立即连续调用,我想在这些 setter 调用的最后一次之后只执行一次内部状态的昂贵更新。

我已经通过代理解决了(或“解决了”?)这个要求。以下将是一个最小的工作代码示例:

#include <iostream>

class complicated
{
public:
    class proxy
    {
    public:
        proxy(complicated& tbu) : to_be_updated(&tbu) {
        }

        ~proxy() {
            if (nullptr != to_be_updated) {
                to_be_updated->update_internal_state();
            }
        }

        // If the user uses this operator, disable update-call in the destructor!
        complicated* operator->() {
            auto* ret = to_be_updated; 
            to_be_updated = nullptr;
            return ret;
        }
    private:
        complicated* to_be_updated;
    };

public:
    proxy set_a(int value) {
        std::cout << "set_a" << std::endl;
        a = value;
        return proxy(*this);
    }

    proxy …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++14 c++17

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

OpenGL ES 3.0上的sRGB Framebuffer

我正在使用Java开发OpenGL ES 3.0 Android项目.我需要实现伽马校正,并且在某处我已经读过,在OpenGL ES 3.0中将支持sRGB纹理.所以我的目的是在渲染到默认的帧缓冲区之前调用glEnable(GL_FRAMEBUFFER_SRGB).

但是,当我试着打电话的时候

GLES30.glEnable(GLES30.GL_FRAMEBUFFER_SRGB)
Run Code Online (Sandbox Code Playgroud)

事实证明,没有GLES30.GL_FRAMEBUFFER_SRGB,但是有一些常量用于sRGB纹理格式,如GLES30.GL_SRGB.

所以,我的问题是:是否可以让OpenGL ES 3.0为我做伽马校正?如果有,怎么样?

否则,我想,我必须手动进行伽马校正.

java android opengl-es srgb opengl-es-3.0

2
推荐指数
1
解决办法
1075
查看次数

如何使用折叠表达式扩展到初始值设定项列表?

我想在一个向量中插入尽可能多的零,因为有一个可变参数模板函数的参数(即一个向量中的参数零的数量)。我正在尝试使用折叠表达式来实现这一点,并且在使用(vec.push_back(zeroHelper(args)), ...);.

我不明白:为什么它不工作时,我尝试直接被“展开”初始化到初始化列表矢量像如下:
std::vector<int> vec = { (zeroHelper(args), ...) };

完整源代码:

template <typename T>
T zeroHelper (T a) { return T{0}; }

template<typename ...Args>
void printer(Args&&... args) {
    std::vector<int> vec; // = { (zeroHelper(args), ...) };
    (vec.push_back(zeroHelper(args)), ...);
    for (auto i : vec) {
        std::cout << i << '\n';
    }
}

int main()
{
    printer(1, 2, 3, 4);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是 OnlineGDB 上的来源。

预期输出:

0
0
0
0

使用初始化列表方法输出:

0 …

c++ variadic-templates fold-expression c++17

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

C++ 最佳实践:通过常量引用或转发引用(又名通用引用)将仅使用(未存储)的 lambda 参数传递给函数

将 lambda 函数作为参数传递给仅使用(但不存储或转发)lambda 函数的函数的最佳(即性能最高、用途最广)的方法是什么?

选项 1:通过常量引用传递它是要走的路吗?

template <typename F>
void just_invoke_func(const F& func) {
    int i = 1;
    func(i);
}
Run Code Online (Sandbox Code Playgroud)

选项2:还是将其作为转发引用(通用引用)传递更好?

template <typename F>
void just_invoke_func(F&& func) {
    int i = 1;
    func(i);
}
Run Code Online (Sandbox Code Playgroud)

后者比前者有什么优势吗?
其中一种解决方案是否有任何危害?

编辑#1:

选项 3:正如Yakk - Adam Nevraumont所指出的,mutablelambdas 不适用于选项 1。那么,另一个采用非常量 l 值引用的版本呢?

template <typename F>
void just_invoke_func(F& func) {
    int i = 1;
    func(i);
}
Run Code Online (Sandbox Code Playgroud)

问题是:选项 2比选项 3有什么优势吗?

编辑#2:

选项 4:已提出另一种按值获取 lambda 的版本。

template <typename …
Run Code Online (Sandbox Code Playgroud)

c++ c++17

1
推荐指数
2
解决办法
194
查看次数