我正在使用在运行时确定的参数调用一些用户定义的可调用对象。我有以下工作:
using argument_t = std::variant< int, bool, double, std::string >;
using argument_list = std::vector< argument_t >;
template < typename Callable, std::size_t... S >
auto invoke_with_args_impl( Callable&& method, const argument_list& args, std::index_sequence< S... > )
{
return std::invoke( method, args[S]... );
}
template < std::size_t size, typename Callable >
auto invoke_with_args_impl( Callable&& method, const argument_list& args )
{
if ( args.size() != size )
{
throw std::runtime_error( "argument count mismatch" );
}
return invoke_with_args_impl( std::forward< Callable >( method ), args, std::make_index_sequence< size >() );
}
template < typename Callable >
auto invoke_with_args( Callable&& method, const argument_list& args )
{
switch ( args.size() )
{
case 0:
return method();
case 1:
return invoke_with_args_impl< 1 >( std::forward< Callable >( method ), args );
//.... ad nauseam
这一切都可以正常工作,但是,argument_t
必须是用户定义函数中所有参数的类型才能成功工作。
我试图弄清楚如何改为传递当前替代类型的变体。
就像是
return std::invoke( method, std::get< args[S].index() >( args[S] )... );
但显然这不起作用......不幸的是,我在这方面的技能已经结束。
如何才能做到这一点?