如何检测可变函数参数列表中给定类型的参数的可用性,并在处理完所有参数后采取行动
How to detect availability of a parameter of given type in variadic funtion arguments list and act after all parameters have been processed
我的 class 有以下 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 对象恢复。
在实践中,我的 class 是一种接受自定义类型作为运算符参数的数学对象,其中一些需要 ostream 的类似操纵器的函数,但要求用户在开始之前提供一些最终操作数通常非常非常不方便下一个这样的用法。
我想到的一个想法是,每当 args...
列表中提供 TSeek
时,return 一种不同类型的新智能类型的临时对象,以便在最后一个之后参数被转发给它,它会自动销毁,这真的是我要完成我的最终任务的时候了!
我应该这样继续还是...?
嗯...据我所知,流 operator<<()
必须正好 接收两个参数。
所以你不能定义可变参数operator<<()
。
如果您接受通用模板可变参数函数,例如 foo()
,如果您可以使用 C++17 并不困难。
要检查 Args...
包中是否存在类型 TSeek
,您可以写成
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);
}
我的 class 有以下 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 对象恢复。
在实践中,我的 class 是一种接受自定义类型作为运算符参数的数学对象,其中一些需要 ostream 的类似操纵器的函数,但要求用户在开始之前提供一些最终操作数通常非常非常不方便下一个这样的用法。
我想到的一个想法是,每当 args...
列表中提供 TSeek
时,return 一种不同类型的新智能类型的临时对象,以便在最后一个之后参数被转发给它,它会自动销毁,这真的是我要完成我的最终任务的时候了!
我应该这样继续还是...?
嗯...据我所知,流 operator<<()
必须正好 接收两个参数。
所以你不能定义可变参数operator<<()
。
如果您接受通用模板可变参数函数,例如 foo()
,如果您可以使用 C++17 并不困难。
要检查 Args...
包中是否存在类型 TSeek
,您可以写成
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);
}