将模板变量传递到C 中的模板函数
Passing Template Variable to Template Function in C++14
我正在编写一个编译器,该编译器将C 编译为我的C 代码有类型问题。该语言本来是懒惰的,所以我们有一个懒惰的价值包装器,块。这是其中的一部分,以及有问题的代码:
#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
是类模板的名称。要在其定义之外参考类模板的成员,您需要指定模板参数。
如果解决此错误,将会有更多。
我最终使用了完全不同的解决方案。我通过添加第二个定义来超载apply
:
template<class F, class... Args>
auto apply(F f, Args... as) -> decltype(f(as...))
{
return f(as...);
}
并将其重写为简单:
auto multiply = [](auto x, auto y) { return x * y; };
因此,我们的库函数不会在懒惰的包装器中,而用户定义的功能(无法使用我们的语言中的模板)。
相关文章:
- 未使用的C++未优化的静态成员函数/变量
- 内联函数/变量的外部链接
- 同一函数中的静态函数变量初始化顺序
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 如何从doxygen输出中排除类的无证件成员函数/变量
- 如何在LUA C API中分配全局LUA函数变量
- 如何将函数变量传递给C lambda函数
- 通过另一个C++函数更改函数变量
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- C++:静态成员不能在声明时定义,但静态函数变量可以?
- apache-frift是否支持函数变量作为参数
- 类函数/变量在使用之前必须声明
- 函数变量去哪里
- 无法使用函数变量?错误表达式必须具有类类型
- 如何在main中使用函数变量
- 每当尝试打印函数变量时,C++ cout 错误
- 是否存在查看成员函数/变量的整洁等效项
- 访问友元类之间的函数变量
- 函数到函数变量
- 一个定义规则是否强制创建一个静态函数变量