【发布时间】:2012-06-28 20:35:43
【问题描述】:
受this question 的启发,我想知道是否有任何技巧(如 SFINAE)来实现相反的效果。
编辑:添加示例
我有这样的东西(它非常简化,因为它有很多细节):
#include <iostream>
class Base {
public:
Base(){}
virtual ~Base(){
}
void initialize() { implementation(); }
private:
virtual void implementation() = 0;
};
class Derived : public Base {
private:
virtual void implementation() { std::cout << "initialization" << std::endl;}
};
int main() {
std::unique_ptr<Base> b(new Derived());
b->initialize();
return 0;
}
初始化方法必须被调用。
但是如果我将初始化方法放在 Base 构造函数中,它将调用一个纯虚方法。 我想知道是否有办法防止有人不当使用构造的对象。
编辑:我的“解决方案”:
#include <iostream>
class Base {
public:
virtual ~Base(){
}
Base() {};
private:
void initialize() { implementation(); }
virtual void implementation() = 0;
template<class DerivedType> friend Base *factory();
};
class Derived : public Base {
private:
Derived() {}
virtual void implementation() { std::cout << "initialization" << std::endl;}
template<class DerivedType> friend Base *factory();
};
template<class DerivedType>
static Base *factory(){
Base *b = new DerivedType();
b->initialize();
return b;
}
int main() {
std::unique_ptr<Base> b(factory<Derived>());
return 0;
}
【问题讨论】:
-
这有点投机/修辞。你有实际用例吗?
-
有一些工具可以检测无法访问的代码。
-
一般情况下不可能导致编译器错误。您只能通过运行程序来确定是否会调用函数。
标签: c++ visual-studio-2010 compiler-errors