#include <iostream>
#include <variant>
#include <vector>
#include <string>
using namespace std;
class Data
{
public:
Data() {}
virtual ~Data() {}
};
template <typename T>
class AnyData : public Data
{
public:
AnyData(T v) : m_data(v)
{
}
virtual ~AnyData()
{
}
operator T() const
{
try
{
T v = std::get<T>(m_data);
// cout << "get data===" << v << endl;
return v;
}
catch (const std::exception &e)
{
std::cerr << e.what() << '\n';
}
}
private:
typedef std::variant<int8_t, int16_t, int32_t, int64_t, float, double, bool, std::string> data_type;
data_type m_data;
};
class Vector
{
public:
Vector() {}
virtual ~Vector()
{
auto it = m_vec.begin();
for (; it != m_vec.end(); ++it)
{
delete *it;
}
m_vec.clear();
}
template <typename T>
T GetValue(int index)
{
if (index >= m_vec.size())
{
return T();
}
AnyData<T> *d = dynamic_cast<AnyData<T> *>(m_vec[index]);
return T(*d);
}
template <typename T>
void Insert(const T &t)
{
m_vec.emplace_back(new AnyData<T>(t));
}
private:
std::vector<Data *> m_vec;
};
class Trigger
{
public:
Trigger() {}
virtual ~Trigger() {}
template <typename T>
void trigger_func(const T &t) //结束递归函数
{
m_vector.Insert<T>(t);
}
template <typename T, typename... Args>
void trigger_func(const T &t, const Args &... rest)
{
m_vector.Insert<T>(t);
trigger_func(rest...); // 递归调用,打印其他实参
}
void Print()
{
cout << m_vector.GetValue<string>(0) << endl;
cout << m_vector.GetValue<int>(1) << endl;
cout << m_vector.GetValue<float>(2) << endl;
cout << m_vector.GetValue<int>(3) << endl;
}
private:
Vector m_vector;
};
// 测试
int main()
{
Trigger trigger;
trigger.trigger_func(std::string("1000"), 2, 3.14f, 42);
trigger.Print();
cout << endl;
return 0;
}
注意:因为用到了std::variant,编译需要指定为 17,加上 --std=c++17