gpt4 book ai didi

c++ - 在 C++14 中将模板变量传递给模板函数

转载 作者:太空狗 更新时间:2023-10-29 21:40:54 24 4
gpt4 key购买 nike

我正在编写一个可编译为 C++ 的编译器,但我的 C++ 代码存在类型问题。该语言本来就是惰性的,因此我们有一个惰性值包装器 Chunk。这是它的一部分,以及有问题的代码:

#include <functional>
#include <memory>

template<class T>
class Chunk
{
public:
Chunk();
Chunk(std::function<T()> f);
T operator()();

std::function<T()> f_;

private:
std::shared_ptr<T> cache_;
};

template<class T>
T Chunk<T>::operator()()
{
if(cache_ == nullptr)
cache_ = std::make_shared<T>(f_());
return *cache_;
}

template<class T, class F>
T operator*(Chunk<T> t1, Chunk<F> t2)
{
return t1() * t2();
}

template<class T, class... Args>
T apply(Chunk<std::function<T(Args...)>> c, Args... as)
{
return c()(as...);
}

template<class F>
auto toChunk(F f) -> Chunk<decltype(f())>
{
return Chunk<decltype(f())>(f);
}

template<class T, class F>
struct ops
{
static const auto multiply =
toChunk([]() { return ops::multiply_; });

static const auto multiply_(Chunk<T> x, Chunk<F> y) -> decltype(x * y)
{
return x * y;
}
};

int main()
{
Chunk<double> t = toChunk([]() { return 1.0; });
Chunk<float> f = toChunk([]() { return 2.0f; });

apply(ops::multiply, t, f);
return 0;
}

我想不出 multiply 的定义来使这项工作没有得到 used without template parameters 错误。 (这里可能还有第二个问题,因为 multiply_ 不是 std::function,但编译器首先会因缺少模板参数而中断。)

我可以为每一对类型写很多重载,但这真的很难看。我尝试在没有模板类的情况下制作一个模板变量,即使我使用的是 C++14,在 multiply_ 处得到 cannot resolve address of overloaded function 用这个替代方法定义:

template<class T, class F>
auto multiply_(Chunk<T> x, Chunk<F> y) -> decltype(x * y)
{
return x * y;
}
template<class T, class F>
Chunk<decltype(multiply_)> multiply = toChunk([]() { return multiply_; });

当然,我随后将 ops::multiply 更改为简单的 multiply。有什么克服这个问题的建议吗?

最佳答案

ops 是类模板的名称。要在其定义之外引用类模板的成员,您需要指定模板参数。

不过,如果您修复此错误,还会有更多错误。

关于c++ - 在 C++14 中将模板变量传递给模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30143242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com