正在解压缩元组可变模板参数

  • 本文关键字:参数 解压缩 元组 c++
  • 更新时间 :
  • 英文 :


我想解压缩可变类型的元组,并将参数转发到正确的类?

class IntegerField(){
public:
IntegerField(int i){}
};
class StringField(){
public:
StringField(std::string s){}
};
class Person{
public:
IntegerField id(){ return mId; }
StringField name() { return mName; }
private:
IntegerField mId;
StringField mName;
};
template<typename... Types>
void createField(Types... args){
// want to create IntegerField or StringField and pass the args "42" or "Joe" respectively
// exand the line to something like
// std::make_unique<IntegerField>(42) 
// ...
auto uPtr = std::make_unique<Types...>(std::forward<Types...>(args)...);  // # ???
}
int main(){
using IF = std::tuple<IntegerField, int>;
using SF = std::tuple<StringField, std::string>;
Person person;
createField<IF, SF>({person.id(), 42},{person.name(), "Joe"});
}

在很大程度上基于@arnes的工作:

#include <memory>
#include <type_traits>
#include <tuple>
#include <utility> // For std::index_sequence_for
class IntegerField{
public:
IntegerField(int i){}
};
class StringField{
public:
StringField(std::string s){}
};
class Person{
public:
Person() : mId { 5 } , mName { "empty" } {}
IntegerField id(){ return mId; }
StringField name() { return mName; }
private:
IntegerField mId;
StringField mName;
};
namespace detail {
template<class Field, class... Args, std::size_t... Indices>
auto create(const std::tuple<Field, Args...>& t, std::index_sequence<Indices...> seq) {
return std::make_unique<Field>(std::get<Indices + 1>(t)...);
}
}
template<class Field, class... Args>
auto create(const std::tuple<Field, Args...>& t) -> std::enable_if_t<std::is_constructible_v<Field, Args...>, std::unique_ptr<Field>> {
return detail::create(t, std::index_sequence_for<Args...>{});
}

template<typename... Types>
void createField(Types... args){
auto res = std::make_tuple( create( std::forward<Types>( args ) )... );
}
int main(){
using IF = std::tuple<IntegerField, int>;
using SF = std::tuple<StringField, std::string>;
Person person;
createField<IF, SF>({person.id(), 42},{person.name(), "Joe"});
}

导螺杆

最新更新