我试图使用boost :: variant与模板类型.例如,我有一个模板类型Tag<T>和升压::变体AnyTag包括类型,如Tag<double>,Tag<int>和Tag<std::string>.每个Tag<T>都有类型T的成员.现在,我想将这些变体放在容器中,并在运行时简单地分配值,例如,
for(AnyTag & tag: AllTags) {
setValue(tag, getValueFromXml());
}
Run Code Online (Sandbox Code Playgroud)
该函数setValue(AnyTag &tag, T &val)必须使用AnyTag标记的运行时类型才能正确地为标记分配正确的值.我可以在下面找到解决问题的尝试,并且它使用另一个变体,其中仅包含可以在AnyTag(TagValueType)中使用的可能的T类型.
template<typename T, typename = void>
class Tag {};
template <typename T>
class Tag<T, EnableIf<std::is_arithmetic<T>>> {
public:
T value = 0;
std::string address = "";
T maxValue = std::numeric_limits<T>::max();
typedef T value_type;
};
template <typename T>
class Tag<T, DisableIf<std::is_arithmetic<T>>> {
public:
T value;
std::string address = "";
typedef T value_type;
};
typedef boost::variant<Tag<std::string>,
Tag<double>, …Run Code Online (Sandbox Code Playgroud)