我要「過濾器」就像在下面的代碼的可變參數模板函數的參數包(需要「過濾器」只有某些類型的變量):過濾
#include <iostream>
#include <utility>
#include <cstdlib>
struct Z {};
struct test
{
using result_type = void;
template< typename... P >
result_type apply_filter(P &&... _p) const
{
using std::forward;
return operator() (forward<P>(_p)...);
}
template< typename... T >
result_type operator() (std::string const & _s, T &&... _tail) const
{
std::cout << _s << std::endl;
return operator() (std::forward<T>(_tail)...);
}
template< typename... T >
result_type operator() (double const & _x, T &&... _tail) const
{
std::cout << _x << std::endl;
return operator() (std::forward<T>(_tail)...);
}
template< typename... T >
result_type operator() (Z const &, T &&... _tail) const
{
std::cout << "z" << std::endl;
return operator() (std::forward<T>(_tail)...);
}
private :
result_type operator()() const { return; }
template< typename T, typename U >
using is_the_same = std::is_same< typename std::remove_const< typename std::remove_reference<T>::type >::type, U >;
template< typename T >
typename std::enable_if< is_the_same< T, std::string >::value, std::string >::type
forward(T && _s) const
{
return "\"" + _s + "\"";
}
template< typename T >
typename std::enable_if< is_the_same< T, double >::value, double >::type
forward(T && _x) const
{
return _x + 1.0;
}
};
int main()
{
test test_;
double x = 0.0;
std::string s = "s";
Z z;
test_.apply_filter(x, s, z);
return EXIT_SUCCESS;
}
但是std::forward
比apply_filter
中的成員函數具有更高的優先級。因此在這裏沒有發生過濾。
有什麼解決方法嗎?
什麼是預期的輸出? – jrok
1)爲什麼你改變'forward'中的指定輸出而不是'operator()'中的指定輸出? 2)你可以定義另一個在你的類中定義的函數「層」,並在'apply_filter'中調用它們而不是'forward'。 – dyp
改變每個'std :: cout << ... << std :: endl;'到'std :: cout << forward(...)<< std :: endl;'' –