我试着用谷歌搜索没有运气,所以我在这里尝试.
我有几个类,每个类都定义一个成员struct foo.此成员类型foo本身可以继承自前一个类,因此可以获取成员类型foo.
我想foo使用模板元编程访问嵌套类型(见下文),但是c ++名称注入引入了问题,因为上层foo类型名称被注入到较低foo类型中,而上层类型名称在我想要访问较低类型时被解析,比如使用A::foo::foo.
这是一个例子:
#include <type_traits>
struct A;
struct B;
struct A {
struct foo;
};
struct B {
struct foo;
};
struct A::foo : B { };
struct B::foo : A { };
// handy c++11 shorthand
template<class T>
using foo = typename T::foo;
static_assert( std::is_same< foo< foo< A > >, foo< B > >::value,
"this should not fail (but it does)" ); …Run Code Online (Sandbox Code Playgroud) 如果替换失败涉及模板别名(例如,缺少的成员类型名称上的模板别名,如下面的代码片段中所示),是否应触发错误?
Clang和gcc似乎对此持不同意见:
// some types
struct bar { };
struct foo {
typedef void member_type;
};
// template alias
template<class T>
using member = typename T::member_type;
template<class T>
void baz(... ) { }
// only works for gcc, clang fails with: no type named 'member_type'
// in 'bar'
template<class T>
void baz( member<T>* ) { }
int main(int, char** ) {
baz<bar>(0); // picks first
baz<foo>(0); // picks second
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以问题是:谁是正确的,为什么?
谢谢 :-)
如果我正确理解Haskell中的ST monad,则以runST巧妙的方式使用rank-2类型,以确保计算在转义monad时不引用任何其他线程.
我有一个带有Hindley-Milner类型系统的玩具语言,我的问题如下:是否可以扩展HM类型系统,使用ad-hoc规则键入runST应用程序,以便ST monad可以安全地逃避,而不会引入排名-2种类型?
更确切地说,runST将具有类型forall s a. ST s a -> a(即rank-1)并且输入规则将首先尝试以与在let-expression中概括类型的方式相同的方式来推广计算类型,但是如果s发现类型变量被绑定则引发类型错误.
上面只限制了接受的程序与香草HM相比,所以看起来很合理,但我不确定.这会有用吗?
在仿射类型系统中,资源最多可以使用一次。
从 Hindley-Milner 类型系统开始,似乎强制关联的一种简单方法是在使用变量的类型规则时简单地从当前类型上下文中删除变量(如LinearML 上的这些幻灯片建议,第 15 页)。
这就是加强亲和力的全部内容吗?或者还有什么更复杂的事情要做?
c++ ×2
c++11 ×2
haskell ×1
linear-types ×1
monads ×1
nested ×1
sfinae ×1
type-systems ×1
typename ×1