这是场景:
template <template <typename> class T, typename V>
struct parent {
void do_something();
};
template <typename V>
struct child : public parent<child, V> {
void do_something(V argument);
using parent<child, V>::do_something; // C3200: invalid template argument for template parameter 'IMPL', expected a class template
};
Run Code Online (Sandbox Code Playgroud)
上面的代码无法使用给定的错误(MSVC 9.0)在给定的行上进行编译.但是,如果我写这个,在类定义之外child
:
template <typename V>
struct parent_identity_meta {
typedef typename parent<child, V> type; // no error!
};
Run Code Online (Sandbox Code Playgroud)
我现在可以在以下内容中成功完成以下操作child
:
using parent_identity_meta<V>::type::do_something;
Run Code Online (Sandbox Code Playgroud)
我知道有一个限制(在C++ 11中得到缓解)你不能对模板进行typedef,但我不认为这是我在这里遇到的,否则typedef parent_identity_meta
会失败.它似乎是child
指模板不在其自己的类定义内部时,以及从内部生成的类. …
我刚刚开始探索Kotlin,我很好奇它超越了Java的核心动态绑定/调度语义.
假设我编写的代码看起来像这样:
class Animal { fun add(x:Animal) = Animal() } object Horse : Animal object Donkey : Animal object Mule : Animal fun Horse.add(x:Horse) = Horse() fun Horse.add(x:Donkey) = Mule() fun main(args : Array) { val h:Animal = Horse val d:Animal = Donkey val child = h + d }
基于上面的代码 - 我可以期待什么?我是否在运行时失败,因为Horse没有实现添加(动物)?它是否可以在上述性质的调用中准确区分它们,其中被比较的值的编译时类型是Animal(至少如编写),但它们的运行时类型更具体?如果我们使用var而不是val,它会改变什么吗?
提前致谢.
编辑:修改核心代码 - 我看到第一响应者强调的问题,我没有直接思考.显然我还没有编译过这个,我仍然在概念层面进行探索.
另外,我会在实际的编译器中给它一个镜头,但是我担心会出现它工作的情况和其他不基于我不完全理解的某些标准的情况.我无法找到关于如何在Kotlin中实现动态调度的参考文档(对于Java来说也不确定它是什么;几个月前我写了一些我认为可以基于JVM文档工作的东西,但它没有不,我从来没有机会探究到底为什么.
无论如何再次感谢!