2

operator<<()我的C++17 折叠类有 以下重载:

template <typename... Args>
ostream& operator <<(Args&&... args)
{
    //Currently:
    return (m_osCout << ... << args);

    //What I need:
    IF ANY OF THE parameters in args "was" of type, say TSeek,  
    which can be a manipulator function etc,  then AFTER finishing 
    with the parameter pack, I would like to do some further operation
    , for instance, restore the state of m_osCount
 }

如上所述,我需要什么吗?任何设置一些方向的部分回应将不胜感激......

尽管我提出了这个问题,就好像我在要求一个自动流标志恢复器一样,但请注意,我追求的是通用解决方案,而不是特别恢复std::cout或 o/istream 对象恢复。在实践中,我的类是一种接受自定义类型作为运算符参数的数学对象,其中一些需要 ostream 的类似操纵器的函数,但要求用户在开始下一次此类使用之前提供一些最终操作数通常非常不方便。

我想到的一个想法是,TSeek只要在args...列表中提供了一种新的智能类型的不同类型的临时对象,那么在将最后一个参数转发给它之后,它将自动销毁,这真的是我想做我的最后任务!

我应该这样进行还是...?

4

1 回答 1

2

嗯...据我所知,一个流operator<<()必须恰好接收两个参数。

所以你不能定义一个 variadic operator<<()

例如,如果您接受通用模板可变参数函数,foo()那么您是否可以使用 C++17 并不是很困难。

要检查包中是否存在类型TSeekArgs...您可以编写如下内容

constexpr bool withTSeek { (std::is_same<Args, TSeek>{} || ...) };

下面是一个完整的编译示例

#include <iostream>
#include <utility>
#include <type_traits>

struct TSeek
 { };

std::ostream & operator<< (std::ostream & o, TSeek const &)
 { return o << " [TSeek!] "; }

template <typename ... Args>
std::ostream & foo (std::ostream & o, Args && ... args)
 {
   constexpr bool withTSeek { (std::is_same<Args, TSeek>{} || ...) };

   (o << ... << args);

   if ( withTSeek )
      o << " --- TSeek detected" << std::endl;
   else 
      o << " --- TSeek NOT detected" << std::endl;

   return o;
 }

int main ()
 {
   foo(std::cout, 1, 2, TSeek{}, 5, 7);
   foo(std::cout, 11, 13, 17, 19, 23);
 }
于 2019-01-10T23:30:34.290 回答