C++ 具有节点的树可以是3种不同的类型(字符串、int或float)

C++ 具有节点的树可以是3种不同的类型(字符串、int或float),c++,templates,data-structures,C++,Templates,Data Structures,需要实现任意树,其中每个节点可以是字符串、整数或实数,并且具有任意数量的子节点,也可以是这三种类型中的一种(子节点可以是不同的类型)。在为节点设计类时,我有两个想法: template <typename T> class tree_node { using value_type = typename std::enable_if < std::is_same<std::string, T>::value ||

需要实现任意树,其中每个节点可以是字符串、整数或实数,并且具有任意数量的子节点,也可以是这三种类型中的一种(子节点可以是不同的类型)。在为节点设计类时,我有两个想法:

template <typename T>
class tree_node
{
    using value_type = typename std::enable_if
        <
            std::is_same<std::string, T>::value ||
            std::is_same<int, T>::value ||
            std::is_same<float, T>::value, T
        >::type;
    value_type data;
    std::vector<??????> children;// What type must be there?
public:
...
模板
类树节点
{
使用value\u type=typename std::启用
<
std::值是否相同||
std::值是否相同||
std::值是否相同,T
>::类型;
值类型数据;
std::vector children;//必须有什么类型?
公众:
...

struct node_data{};
结构str_节点:公共节点_数据
{
std::字符串数据;
str_节点(std::string&str):数据(str){};
};
结构int_节点:公共节点_数据
{
int数据;
int_节点(intn):数据(n){};
};
结构浮动节点:公共节点数据
{
浮动数据;
float_节点(float f):数据(f){};
};
类树节点
{
std::共享值;
性病媒儿童;
公众:
....
是否有一个优雅的解决方案(例如,一些设计模式)来解决这个问题?

模板
template <typename T>
class tree_node
{
    static_assert(std::is_same_v<int, T> || std::is_same_v<float, T>
        || std::is_same_v<std::string, T>, "...your error message");
    using value_type = T;
    value_type data;
    std::list<std::shared_ptr<value_type>> children;
   //...
};
类树节点 { 静态断言(std::is_same_v | | std::is_same_v ||std::是否相同?“…您的错误消息”); 使用值_type=T; 值类型数据; 性病:列出儿童; //... };
也许复合模式可以帮助您:

#包括
#包括
#包括
结构节点{
虚空打印()=0;
};
类复合节点:公共节点{
私人:
std::向量节点;
公众:
空添加(索引节点*节点){
节点。推回(节点);
}
void print()覆盖{
用于(索引节点*节点:节点){
节点->打印();
}
}
};
类IntNode:公共索引节点{
私人:
int值;
公众:
IntNode(inti){
值=i;
}
void print()覆盖{

std::无法查看
联合
…或使用。
template <typename T>
class tree_node
{
    static_assert(std::is_same_v<int, T> || std::is_same_v<float, T>
        || std::is_same_v<std::string, T>, "...your error message");
    using value_type = T;
    value_type data;
    std::list<std::shared_ptr<value_type>> children;
   //...
};