我通过枚举
专门化模板template<>
class specialized_class<user_option=CHOICE_ENUM::CHOSEN_OPTION>
{
public:
typedef second_class<user_option> obj_type;
在这里,要定义second_class
,我需要知道用户选择了什么类型。我需要命名所选的选项。但是我的代码的第二行是非法语法。怎么做我需要的?
即使
typedef second_class<CHOICE_ENUM::CHOSEN_OPTION> obj_type;
解决了这个问题。我更喜欢避免这种方式,因为它使用的是魔术类型,并且类中的代码需要修改以便在其他地方使用。
答案 0 :(得分:2)
如果您正在尝试减少专业化中CHOICE_ENUM::CHOSEN_OPTION
的出现次数。也许以下就足够了。
enum Enum
{
E1,
E2
};
template<Enum E>
class Foo
{
};
template<Enum E>
class Bar
{
};
template<>
class Foo<E2> // 1 occurrence to change if copy/pasted for a new specialization
{
public:
static const Enum enum_value = E2; // Last occurrence to change
typedef Bar<enum_value> obj_type;
};
答案 1 :(得分:1)
从简短的例子中可以说一下,但是你可以将特化的通用部分归结为基类,以避免重复参数。
template<CHOICE_ENUM option>
struct user_option_base {
static const CHOICE_ENUM user_option = option;
};
template<>
class specialized_class<CHOICE_ENUM::CHOSEN_OPTION>
: user_option_base<CHOICE_ENUM::CHOSEN_OPTION>
{
public:
typedef second_class<specialized_class::user_option> obj_type;
要避免符合条件specialized_class::user_option
,您可以使用using user_option_base::user_option;
。
答案 2 :(得分:0)
您可以使用部分特化以及一些sfinae,但解决方案最终会产生一些wtf因子。 Here's演示。
首先,更改主模板
template<CHOICE_ENUM e, typename Enable = void>
class specialized_class;
默认参数允许您继续使用specialized_class
之前使用它的方式 - 您仍然可以假装它是一个参数类模板。现在,将您的完整专业化转换为部分专业化+ sfinae:
template <CHOICE_ENUM user_option>
class specialized_class<user_option,
std::enable_if_t<user_option == CHOICE_ENUM::CHOSEN_OPTION>>
{
//stuff
};