模板专业启用eNable_if
Template specialization enable_if
我试图以这种方式专业化模板:
class PropertyBase
{
public:
SfPropertyBase(string name)
{
Name = name;
}
virtual ~SfPropertyBase() {}
string Name;
virtual bool FromString(Object* obj, string str) = 0;
};
template< typename T>
class Property : public SfPropertyBase
{
public:
Property(string name) : SfPropertyBase(name)
{
//specific to Property stuff
}
template<typename U = T>
typename std::enable_if<(std::is_class<U>::value && std::is_pointer<U>::value), bool>::type
FromString(Object* obj, string str)
{
//do something
return true;
}
template<typename U = T>
typename std::enable_if<!std::is_class<U>::value || !std::is_pointer<U>::value), bool>::type
FromString(Object* obj, string str)
{
//do something
return true;
}
}
然后,当我尝试初始化此类实例时:
auto prop = new Property<int>("IntProperty");
我得到invalid new-expression of abstract class type Property<int>
。我了解PropertyBase
中有一个抽象功能,但是我也提供Property
的专业,其中T
是一类,而不是。
发生了什么以及如何修复它?
注意:如果T是类/指针和所有其他情况,我要实现的是专业FromString
。
Property
中的 FromString
都是函数模板,它们不能覆盖 base类的非网板virtual
函数。(实际上,功能模板不能是virtual
函数(。
您可以在Property
中添加另一个非模板FromString
;您可以使用关键字orverride
确保覆盖。例如
bool FromString(Object* obj, string str) override {
return FromString<>(obj, str);
}
live
一个函数模板不能用作非模板虚拟函数的效率。函数模板不是函数,它是呼叫时创建功能按需创建功能的食谱。
代码必须直接在派生类对象上调用FromString
才能使Sfinae工作。如果您想根据模板参数类型提供不同的Overrider,一种方法是通过中间基础进行。
template<typename T, typename = void>
struct FromStringProvider;
template<typename T>
struct FromStringProvider<T, typename std::enable_if<(std::is_class<U>::value && std::is_pointer<U>::value)>::type> : SfPropertyBase {
bool FromString(Object* obj, string str) override
{
//do something
return true;
}
};
如果您需要访问派生类,则可以使用基于CRTP的方法。只需将派生类作为额外的参数传递,然后依靠其静态接口来访问所需的零件。
如果您具有相同条件下的虚拟功能集,则这种替代方法特别有用。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- SFINAE with boost enable if