#include <string>
#include <iostream>
#include <boost/variant.hpp>

namespace NsSemSDK
{

struct STreeConstructionRuleRegexp {
    std::string m_strEntity;
};

struct STreeConstructionRuleString {
    std::string m_strEntity;
};

struct STreeConstructionRuleIdentifier {
    std::string m_strEntity;
};

typedef int STreeConstructionRuleNumber;

std::ostream& operator<<(std::ostream& stream,
                         const STreeConstructionRuleRegexp& val)
{
    return stream << '\'' << val.m_strEntity << '\'';
}

std::ostream& operator<<(std::ostream& stream,
                         const STreeConstructionRuleString& val)
{
    return stream << '"' << val.m_strEntity << '"';
}

std::ostream& operator<<(std::ostream& stream,
                         const STreeConstructionRuleIdentifier& val)
{
    return stream << val.m_strEntity;
}

typedef boost::variant<
    STreeConstructionRuleRegexp,
    STreeConstructionRuleNumber
> STreeConstructionRuleOperand;

// STreeConstructionRuleString, STreeConstructionRuleIdentifier
}

using namespace NsSemSDK;

int main()
{
    STreeConstructionRuleNumber num = 1024;
    STreeConstructionRuleOperand operand = num;
    std::cout << operand << std::endl;
}

