【发布时间】:2015-04-24 08:45:35
【问题描述】:
假设以下模板构造:
enum class ENUM {SINGLE, PAIR};
// General data type
template<ENUM T, class U>class Data;
// Partially specialized for single objects
template<class U>Data<ENUM::SINGLE, U> : public U {
// Forward Constructors, ...
};
// Partially specialized for pairs of objects
template<class U>Data<ENUM::PAIR, U> : public std::pair<U,U> {
// Forward Constructors, ...
};
在我的代码中,我希望能够编写类似的东西
template<ENUM T>someMethod(Data<T, SomeClass> data) {
for_single_or_pair {
/*
* Use data as if it would be of type SomeClass
*/
}
}
这应该和以下方法的组合一样:
template<>someMethod(Data<ENUM::SINGLE, SomeClass> data) {
data.doStuff();
}
template<>incrementData(Data<ENUM::PAIR, SomeClass> data) {
data.first.doStuff();
data.second.doStuff();
}
即我希望能够使用一对(相同类型的)对象,就好像它是一个对象一样。当然,我可以为 Data<ENUM::PAIR, T> 重新实现 T 类型的方法(参见 dau_sama 的答案),对于给定的示例,它看起来像:
template<>Data<ENUM::PAIR, SomeClass> : public std::pair<SomeClass, SomeClass> {
doStuff() {
this->first.doStuff();
this->second.doStuff();
}
};
但是我必须为许多方法和运算符以及许多不同的类型执行此操作,尽管方法和运算符看起来都像这个示例。
解决方案的语法可能与我上面写的很不一样,这只是为了演示我想要实现的目标。我更喜欢没有宏的解决方案,但也可以接受。
这样的抽象可以在 C++11 中实现吗?
我想这样做的原因是
- 我不必专门化适用于
ENUM::Single和ENUM::PAIR的模板化方法,因为专门化之间的所有差异都会计算出上述模式(避免大量代码重复)。 - 我的代码中经常出现相同的模式,我可以避免在许多地方实施变通办法,这在每种情况下几乎相同。
【问题讨论】:
标签: c++ c++11 abstraction