如何编码和超载返回自身的功能?C 17
How to code and overload the function that returns itself? C++17
使用MSVC最新(截至25Dec17)。
template< typename T>
auto out_ (const T & val_)
{
// do something with val_
// error: can not deduce auto from out_
return out_;
}
问题是如何编码,然后写上面的小"东西"的几个过载?
是的,它必须是MSVC和C 17。没有GCC 7.0.2也不会编译。Clang尚未尝试。
也许函子模式可能会有所帮助?
请建议...
我很惊讶您的lambda解决方案与G 一起使用。
的clang 投诉 error: variable 'out_' declared with deduced type 'auto' cannot appear in its own initializer
return out_ ;
^
我怀疑正确的clang 拒绝您的代码(错误的G 接受),但我不确定。
无论如何,我发现lambda返回自己很有趣的想法。
我提出了一个基于模板operator()
的结构的非lambda(但我希望标准符合标准和便携式)解决方案,将其返回对象的引用。
我的意思是
struct outS
{
template <typename T>
outS const & operator() (T const & t) const
{
std::cout << t;
return *this;
}
};
因此您可以以身作则,
outS{}("Hello ")("from ")("GCC ")(__VERSION__)(" !");
std::endl
的问题是不同的。
问题是将std::endl
定义(请参阅CPP参考)为
template< class CharT, class Traits >
std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os );
也就是说, std::endl
是模板函数。
您可以写
std::cout << std::endl;
或
std::wcout << std::endl;
因为操作员<<
选择std::endl
的特定版本;但是您不能如下将其传递给outS
outS{}(std::endl);
因为outS
无法选择std::endl
的特定版本。
因此,您必须阐明它;要匹配std::endl
与std::cout
,std::endl
的模板参数为char
和std::char_traits<char>
。
所以你可以写(丑陋,我知道)
outS{}(std::endl<char, std::char_traits<char>>);
但是,如果您实现了基于struct
的解决方案(outS
),则可以添加endl()
方法
outS const & endl () const
{
std::cout << std::endl;
return *this;
}
所以你可以写
outS{}.endl();
以下是一个完整的工作示例
#include <iostream>
struct outS
{
template <typename T>
outS const & operator() (T const & t) const
{
std::cout << t;
return *this;
}
outS const & endl () const
{
std::cout << std::endl;
return *this;
}
};
int main()
{
outS{}("Hello ")("from ")("GCC ")(__VERSION__)(" !").endl();
}
忘记模板。答案是Auto的 lambda:
#include <iostream>
auto out_ = [] ( auto & val_)
{
std::cout << val_;
return out_ ;
};
int main()
{
out_("Hello ")("from ")("GCC ")(__VERSION__)(" !");
// GCC can not compile this: ( std::endl );
}
我并不感到惊讶,因为lambda被实施为函数。为什么GCC 7.0.2不能接受std :: endl,现在我没有时间破译了。
http://coliru.stacked-crooked.com/a/b85b5f89047b5828
至于std :: endl"问题"和 @max66解决方案,我确实认为C 20将具有更好的通用/模板lambdas,其中"自动"将表示"自动" ...
几年前,虽然专注于我的jQuery工作,但我可能已经发明了这个概念,我称其为"呼叫流"……这是有利的。关于它的文章很少。
,但是当时(C 11之前)实现非常类似于 @Max66解决方案。C 17使这个简单的单lambda(在我的回答中)成为一个相当优雅的解决方案,我敢写。
我不确定在这里提供我博客的链接是否可以...
https://dbj.org/callstream-project-euler/
- 时钟功能返回零时差
- C++自动功能返回?
- 类型推论模板功能返回类型
- 从功能返回本地卡斯施说指针
- OPENCL-如何使辅助功能返回阵列并将内存的部分从恒定内存空间转移到私有
- C++ OPEN SSL 库 HMAC 功能返回值每次运行时都不相同
- 如果未存储由功能返回的指针,会发生什么
- 该功能返回空字符串
- C 制造功能返回数组交叉文件
- 当功能返回CSTRING时会发生什么
- 从功能返回将上下文更改为null
- 在模板中获取功能返回类型
- 从最大功能返回Stepanov注释
- 从功能返回时,向量的深拷贝行为
- 当功能返回时,Linux C 系统()调用崩溃
- STL模板功能返回一对
- 从C 中的功能返回时分割故障
- 提升侵入性unordered_set静态成员功能返回错误的尺寸类型
- 在功能返回之前,可以解锁Mutex会增加并发
- getProcAddress()为我的Hello World功能返回null