Nasıl variadic şablon işlevi içine bir demet genişletin'In bağımsız mı?
Variadic şablon bağımsız değişken: şablonu esas alan bir fonksiyonu gözönüne alalım
template<typename Tret, typename... T> Tret func(const T&... t);
Åžimdi, deÄŸerleri t
bir demet var. Nasıl func()
demet bağımsız olarak değerleri kullanarak arayayım mı?
bind()
iÅŸlev nesne call()
işlevi ile ilgili çok şey okudum, ve aynı zamanda apply()
farklı bazı artık eskimiş belgeler işlevi. GNU GCC 4.4 uygulama bind()
sınıf call()
bir işlevi var gibi görünüyor, ama konu ile ilgili çok az belge yok.
Bazı insanlar elle yazılmış bir özyinelemeli kesmek öneririm, ama variadic şablon bağımsız değişken true değerini yukarıdaki gibi durumlarda kullanabilmek için.
Kimse var mı, ya da bu konuda okumak nerede ipucu için bir çözüm var mı?
CEVAP
EÄŸer ilgilenen olursa burada benim kod
Derleme zamanında derleyici yinelemeli olarak çeşitli işlev çağrıları dahil tüm değişkenler göz önüne sermek < olacak temelde;N>->aramalar <N-1>->... - ^çağırır . aramalar <0>sonuncusu olan ve derleyici farklı Ara işlev çağrıları tek işlevi eşdeğeri olan son tutmak için optimize ortadan kalkacak(arg1, arg2, arg3, ...)
Sağlanan statik bir işlev için 2 sürümleri, bir işlev, nesnenin adı ve diğeri.
#include <tr1/tuple>
/**
* Object Function Tuple Argument Unpacking
*
* This recursive template unpacks the tuple parameters into
* variadic template arguments until we reach the count of 0 where the function
* is called with the correct parameters
*
* @tparam N Number of tuple arguments to unroll
*
* @ingroup g_util_tuple
*/
template < uint N >
struct apply_obj_func
{
template < typename T, typename... ArgsF, typename... ArgsT, typename... Args >
static void applyTuple( T* pObj,
void (T::*f)( ArgsF... ),
const std::tr1::tuple<ArgsT...>& t,
Args... args )
{
apply_obj_func<N-1>::applyTuple( pObj, f, t, std::tr1::get<N-1>( t ), args... );
}
};
//-----------------------------------------------------------------------------
/**
* Object Function Tuple Argument Unpacking End Point
*
* This recursive template unpacks the tuple parameters into
* variadic template arguments until we reach the count of 0 where the function
* is called with the correct parameters
*
* @ingroup g_util_tuple
*/
template <>
struct apply_obj_func<0>
{
template < typename T, typename... ArgsF, typename... ArgsT, typename... Args >
static void applyTuple( T* pObj,
void (T::*f)( ArgsF... ),
const std::tr1::tuple<ArgsT...>& /* t */,
Args... args )
{
(pObj->*f)( args... );
}
};
//-----------------------------------------------------------------------------
/**
* Object Function Call Forwarding Using Tuple Pack Parameters
*/
// Actual apply function
template < typename T, typename... ArgsF, typename... ArgsT >
void applyTuple( T* pObj,
void (T::*f)( ArgsF... ),
std::tr1::tuple<ArgsT...> const& t )
{
apply_obj_func<sizeof...(ArgsT)>::applyTuple( pObj, f, t );
}
//-----------------------------------------------------------------------------
/**
* Static Function Tuple Argument Unpacking
*
* This recursive template unpacks the tuple parameters into
* variadic template arguments until we reach the count of 0 where the function
* is called with the correct parameters
*
* @tparam N Number of tuple arguments to unroll
*
* @ingroup g_util_tuple
*/
template < uint N >
struct apply_func
{
template < typename... ArgsF, typename... ArgsT, typename... Args >
static void applyTuple( void (*f)( ArgsF... ),
const std::tr1::tuple<ArgsT...>& t,
Args... args )
{
apply_func<N-1>::applyTuple( f, t, std::tr1::get<N-1>( t ), args... );
}
};
//-----------------------------------------------------------------------------
/**
* Static Function Tuple Argument Unpacking End Point
*
* This recursive template unpacks the tuple parameters into
* variadic template arguments until we reach the count of 0 where the function
* is called with the correct parameters
*
* @ingroup g_util_tuple
*/
template <>
struct apply_func<0>
{
template < typename... ArgsF, typename... ArgsT, typename... Args >
static void applyTuple( void (*f)( ArgsF... ),
const std::tr1::tuple<ArgsT...>& /* t */,
Args... args )
{
f( args... );
}
};
//-----------------------------------------------------------------------------
/**
* Static Function Call Forwarding Using Tuple Pack Parameters
*/
// Actual apply function
template < typename... ArgsF, typename... ArgsT >
void applyTuple( void (*f)(ArgsF...),
std::tr1::tuple<ArgsT...> const& t )
{
apply_func<sizeof...(ArgsT)>::applyTuple( f, t );
}
// ***************************************
// Usage
// ***************************************
template < typename T, typename... Args >
class Message : public IMessage
{
typedef void (T::*F)( Args... args );
public:
Message( const std::string& name,
T& obj,
F pFunc,
Args... args );
private:
virtual void doDispatch( );
T* pObj_;
F pFunc_;
std::tr1::tuple<Args...> args_;
};
//-----------------------------------------------------------------------------
template < typename T, typename... Args >
Message<T, Args...>::Message( const std::string& name,
T& obj,
F pFunc,
Args... args )
: IMessage( name ),
pObj_( &obj ),
pFunc_( pFunc ),
args_( std::forward<Args>(args)... )
{
}
//-----------------------------------------------------------------------------
template < typename T, typename... Args >
void Message<T, Args...>::doDispatch( )
{
try
{
applyTuple( pObj_, pFunc_, args_ );
}
catch ( std::exception& e )
{
}
}
Nasıl variadic bir şablon işlevi heter...
Nasıl variadic bir makro (bağımsız değ...
Nasıl cshtml bir şablon işlevi oluştur...
Nasıl bir sınıf içinde bir şablon işle...
R-Geçerli birden çok bağımsız değişken...