我观看了Walter Brown在Cppcon14上关于现代模板编程(第一部分,第二部分)的演讲,他在演讲中展示了他的void_tSFINAE技术.
示例:
给定一个简单的变量模板,该模板计算void所有模板参数是否格式正确:
template< class ... > using void_t = void;
Run Code Online (Sandbox Code Playgroud)
以及检查是否存在名为member的成员变量的以下特征:
template< class , class = void >
struct has_member : std::false_type
{ };
// specialized as has_member< T , void > or discarded (sfinae)
template< class T >
struct has_member< T , void_t< decltype( T::member ) > > : std::true_type
{ };
Run Code Online (Sandbox Code Playgroud)
我试图理解为什么以及如何运作.因此一个小例子:
class A {
public:
int member;
};
class B {
};
static_assert( has_member< A …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用此方法创建特征实例
val inst = new Object with MyTrait
Run Code Online (Sandbox Code Playgroud)
这很好用,但我想把这个创作转移到生成器函数,即.
object Creator {
def create[T] : T = new Object with T
}
Run Code Online (Sandbox Code Playgroud)
我显然需要清单以某种方式修复类型擦除问题,但在此之前,我遇到了两个问题:
即使有一个隐含的清单,Scala仍然要求T是一个特征.如何添加限制来创建[T]以使T成为特征?
如果我选择使用Class.newInstance方法动态创建实例而不是使用"new",我如何在"new object with T"中指定"with"?是否可以在运行时动态创建新的具体mixin类型?
如何使用与别名类型匹配的案例类?当我从容器中取出CB等时,这就有效.
class DoStuff[TKey](
val c : Container[TKey]#CB
)
{
type CB = Container[TKey]#CB
type C1 = Container[TKey]#C1
type C2 = Container[TKey]#C2
c match {
case C1(e1) => e1 // - not found: value e1 - not found: value C1
case C2(e2) => e2 // - not found: value e2 - not found: value C2
}
}
trait Container[TKey]
{
abstract trait CB
case class C1(val e : AnyRef) extends CB
case class C2(val e : AnyRef) extends CB
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
在查看构建系统时,很多(SCons,bjam,cmake,Tundra等)都有内置的#include扫描程序.然而,gcc和icc提供了一个-MMD(或-MD)选项,它输出C++文件所依赖的头文件的名称.
该-MMD依赖的选择似乎是可靠的.如果添加#include到C文件,其时间戳将更改,以便构建系统重新编译它.如果#include向头文件添加a ,则其时间戳将更改,并且将重新编译所有受影响的C文件.
包括扫描系统中断,但-MMD在我看来是健壮的.哪个最好,为什么?
我正在寻找一种在Lua桌上进行地图/选择的好方法.
例如.我有一张桌子:
myTable = {
pig = farmyard.pig,
cow = farmyard.bigCow,
sheep = farmyard.whiteSheep,
}
Run Code Online (Sandbox Code Playgroud)
如何编写myTable.map(function(f)f.getName)?[假设所有农场动物都有名字]
即.将该函数应用于表中的所有元素.