【发布时间】:2014-09-10 10:54:09
【问题描述】:
我有以下简单的问题:
一个类template<typename D> Parser,它将ModuleType 定义为Module<Parser>。我想将解析器类型注入模块中,以便能够从其中的解析器中再次提取几种类型。这很方便,因为在 Module 中只需要一个模板参数。但是如果解析器需要一些在模块中定义的类型,例如OptionsType,那么问题就来了,通过使用声明using ModuleOptions = ...在Parser中访问它显然不适用于派生类ParserDerived的实例化.错误:error: no type named ‘DType’ in ‘struct ParserDerived<double>’ using DType = typename Parser::DType; 所以不知何故类型
我害怕使用这样的模式,因为我将来可能会意识到,我所有使用这些模式的构造都会崩溃成大量难以理解的编译器故障......
以下问题的更好方法是什么?
#include <iostream>
#include <type_traits>
using namespace std;
template<typename Parser>
struct Module{
using DType = typename Parser::DType;
using OptionsType = int;
};
template<typename D, typename Derived = void >
struct Parser{
using DType = D;
using DerivedType = typename std::conditional< std::is_same<Derived,void>::value, Parser, Derived>::type;
using ModuleType = Module<DerivedType>;
//using ModuleOptions = typename ModuleType::OptionsType; //uncomment this!!
};
template<typename D>
struct ParserDerived: Parser<D, ParserDerived<D> >{
using Base = Parser<D, ParserDerived<D> >;
using ModuleType = typename Base::ModuleType;
using DType = typename Base::DType;
};
int main() {
Parser<double> t;
ParserDerived<double> d;
}
【问题讨论】:
-
您能否将
Parser中的typedef 独立于ModuleTypeA移动到嵌套类型中并将其传递给ModuleA? -
我不明白。如果取消注释标记为“取消注释这个!!”的行,您的代码应该会导致编译器错误,对吗?但事实并非如此。 GCC、clang、Intel 都同意代码没问题。
-
现在我也是一头雾水,在出现错误之前,damm,尝试重现错误
-
有关是否允许这样做的讨论,请参阅stackoverflow.com/q/17478621
-
其实代码,可以,但是hvd的评论还不错!我认为我的问题出在其他地方
标签: c++ templates c++11 metaprogramming