std::initializer_list内置核心语言?在我看来,它是C++ 11的一个非常重要的特性,但它没有自己的保留关键字(或类似的东西).
相反,initializer_list它只是来自标准库的模板类,它具有来自编译器处理的新braced-init-list语法的特殊隐式映射. {...}
起初认为,这个解决方案非常黑客.
这是现在实现C++语言新增功能的方式:通过某些模板类的隐式角色而不是核心语言?
请考虑以下示例:
widget<int> w = {1,2,3}; //this is how we want to use a class
Run Code Online (Sandbox Code Playgroud)
为什么选择了新课程:
widget( std::initializer_list<T> init )
Run Code Online (Sandbox Code Playgroud)
而不是使用类似于以下任何想法的东西:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
Run Code Online (Sandbox Code Playgroud)
const这里和那里添加const和&所有这些都已经成为语言的一部分.我只写了我的第一个想法,我相信还有很多其他方法.
众所周知,有些语言有接口的概念.这是Java:
public interface Testable {
void test();
}
Run Code Online (Sandbox Code Playgroud)
如何以最紧凑的方式在C++(或C++ 11)中实现这一点并且代码噪声很小?我很欣赏一个不需要单独定义的解决方案(让标题足够).这是一个非常简单的方法,即使我发现越野车;-)
class Testable {
public:
virtual void test() = 0;
protected:
Testable();
Testable(const Testable& that);
Testable& operator= (const Testable& that);
virtual ~Testable();
}
Run Code Online (Sandbox Code Playgroud)
这只是一个开始......而且已经超过了我想要的时间.怎么改进呢?也许在std命名空间的某个地方有一个基类专为此而设计?
这是我的gradle构建脚本.
apply plugin: 'groovy'
project.group = "test.tree"
archivesBaseName = "tree"
project.version = "1.0"
manifest.mainAttributes("Main-Class" : "test.tree.App")
sourceCompatibility=1.6
targetCompatibility=1.6
repositories {
mavenCentral()
}
dependencies {
groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.8.6'
testCompile group: 'junit', name: 'junit', version: '4.8.2'
}
Run Code Online (Sandbox Code Playgroud)
这编译得很好
问题是我无法运行创建的JAR,我得到一个例外
java.lang.NoClassDefFoundError: groovy/lang/GroovyObject
所以我猜groovy插件不包含JAR中的所有必要类.
如何创建一个独立的JAR,我可以简单地运行;-)
有那么一刻,我为自己编写了我的第一个无错误的无错误程序感到非常自豪.这是完整的源代码:
int main;
Run Code Online (Sandbox Code Playgroud)
即使没有int,它也可以完美地编译,但会发出警告(即使没有-Wall),作为一个针对无错误程序的程序员,我将它们视为错误.
我愉快地编写了这个应用程序,我立即赶紧启动它.令我惊讶的是,出现了分段错误错误......
现在认真.究竟发生了什么?
我的猜测如下:缺乏main定义.这是如此明显,但编译器允许它.好的,main可以在不同的单元中定义.但即使链接器也没有做任何事情.有什么特别的原因吗?
我有问题让这个演员工作.
编译器告诉我value aNumber不是object的成员Char
def runCastTest() {
val aNumber = 97
val aChar = (Char)aNumber
println(aChar) // Should be 'a'
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
你可以结合std::recursive_mutex使用std::condition_variable,意思是做这样的事情:
std::unique_lock<std::recursive_mutex> lock(some_recursive_mutex)
some_condition_var.wait(lock);
Run Code Online (Sandbox Code Playgroud)
如果不允许,为什么不呢?
我正在使用VC++ 11.
我想知道,为什么Math.sin(double)委托给StrictMath.sin(double)我在Reddit线程中发现问题.提到的代码片段看起来像这样(JDK 7u25):
Math.java:
public static double sin(double a) {
return StrictMath.sin(a); // default impl. delegates to StrictMath
}
Run Code Online (Sandbox Code Playgroud)
StrictMath.java:
public static native double sin(double a);
Run Code Online (Sandbox Code Playgroud)
第二个声明native对我来说是合理的.国家文件Math说:
鼓励代码生成器使用特定于平台的本机库或微处理器指令(如果可用)
问题是:是不是本机库实现了StrictMath足够的平台?JIT比安装的JRE更了解平台(请关注这个案例)?换句话说,为什么不是Math.sin()本地人呢?
假设我有一个Javascript文件
function js_main(args){
/* some code */
var x = api_method1(some_argument);
/* some code */
}
Run Code Online (Sandbox Code Playgroud)
我尝试用javax.scripting通常的方式运行它
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.eval(...);
Run Code Online (Sandbox Code Playgroud)
现在,我想api_method1用Java类处理Javascript 调用.我希望有一些调用的映射/绑定,即每次脚本调用api_method1(arg)一个方法
public Object api_method1(Object arg){ ... }
Run Code Online (Sandbox Code Playgroud)
(将与引擎放在同一个类中)将被调用.
我能做到吗?
假设我们有这个类:
class X {
public:
explicit X (char* c) { cout<<"ctor"<<endl; init(c); };
X (X& lv) { cout<<"copy"<<endl; init(lv.c_); };
X (X&& rv) { cout<<"move"<<endl; c_ = rv.c_; rv.c_ = nullptr; };
const char* c() { return c_; };
private:
void init(char *c) { c_ = new char[strlen(c)+1]; strcpy(c_, c); };
char* c_;
};
Run Code Online (Sandbox Code Playgroud)
以及此示例用法:
X x("test");
cout << x.c() << endl;
X y(x);
cout << y.c() << endl;
X z( X("test") );
cout << z.c() << endl;
Run Code Online (Sandbox Code Playgroud)
输出是:
ctor …Run Code Online (Sandbox Code Playgroud) 我试图定义一个切入点,它将捕获每个注释的方法(即)@CatchThis.这是我自己的注释.
此外,我想访问该方法的第一个参数,它将是Long类型.可能还有其他争论,但我不关心它们.
编辑
这就是我现在所拥有的.我不知道的是如何传递带注释的方法的第一个参数@CatchThis.
@Aspect
public class MyAspect {
@Pointcut(value = "execution(public * *(..))")
public void anyPublicMethod() {
}
@Around("anyPublicMethod() && @annotation(catchThis)")
public Object logAction(ProceedingJoinPoint pjp, CatchThis catchThis) throws Throwable {
return pjp.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)