有没有办法在给定类名(动态)的情况下创建特定类的实例,并将参数传递给其构造函数.
就像是:
Object object = createInstance("mypackage.MyClass","MyAttributeValue");
Run Code Online (Sandbox Code Playgroud)
哪个"MyAttributeValue"是构造函数的参数MyClass.
在过去的几周中,我的代码中出现了一个令人沮丧的错误。我的代码可以完全按照我的计算机上的预期运行,但是一旦将其移植到HPC服务器上,它就会产生奇怪的结果。
我将其归结为:在我的计算机(iMac)上,该函数abs()使用浮点数,但在服务器上将其abs()截断为整数。
例:
服务器
abs(-1.1341234) = 1
Run Code Online (Sandbox Code Playgroud)
我的Mac
abs(-1.1341234) = 1.1341234
Run Code Online (Sandbox Code Playgroud)
现在我知道我可以使用解决此fabs()问题,这不是问题。我看了gcc两台机器上的版本,这是输出:
服务器
g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/apps/software/GCCcore/5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --enable-languages=c,c++,fortran --enable-lto --enable-checking=release --disable-multilib --enable-shared=yes --enable-static=yes --enable-threads=posix --enable-gold=default --enable-plugins --enable-ld --with-plugin-ld=ld.gold --prefix=/apps/software/GCCcore/5.4.0 --with-local-prefix=/apps/software/GCCcore/5.4.0 --enable-bootstrap --with-isl=/dev/shm/GCCcore/5.4.0/dummy-/gcc-5.4.0/stage2_stuff
Thread model: posix
gcc version 5.4.0 (GCC)
Run Code Online (Sandbox Code Playgroud)
我的Mac
g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么abs()在gcc和clang之间会产生不同的结果?从字面上看,这个问题使我花了3个星期的时间,所以可以想像我刚才有点咸...
考虑
#include <iostream>
int main()
{
double a = 1.0 / 0;
double b = -1.0 / 0;
double c = 0.0 / 0;
std::cout << a << b << c; // to stop compilers from optimising out the code.
}
Run Code Online (Sandbox Code Playgroud)
我一直认为这a将是+ Inf,b将是-Inf,并且c将是NaN.但我也听到传言说严格来说浮点除零的行为是未定义的,因此上面的代码不能被认为是可移植的C++.(理论上,这会消除我的百万行加上代码堆栈的完整性.糟糕.)
谁是对的?
注意我对实现定义感到满意,但我在谈论吃猫,在这里恶魔打喷嚏的未定义行为.
c++ floating-point divide-by-zero undefined-behavior language-lawyer
任何人都可以解释一下记忆的布局
std::vector<std::array<int, 5>> vec(2)
Run Code Online (Sandbox Code Playgroud)
它是否提供具有2行5个元素的2D数组的连续内存块?
据我所知,矢量矢量
std::vector<std::vector<int>> vec(2, std::vector<int>(5))
Run Code Online (Sandbox Code Playgroud)
提供存储器中不同位置的两个 长度为 5个元素的连续数组的存储器布局.
对于数组的向量是否相同?
考虑
#include <iostream>
#include <type_traits>
template <class T, class ARG_T = T&>
T foo(ARG_T v){
return std::is_reference<decltype(v)>::value;
}
int main() {
int a = 1;
std::cout << foo<int>(a) << '\n';
std::cout << foo<int, int&>(a) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
我希望两种情况下的输出均为1。但在第一种情况下为0:与默认值class ARG_T = T而不是一致class ARG_T = T&。
我想念什么?
c++ templates function-templates template-argument-deduction argument-deduction
考虑以下(用 C++14 编译)
#include <iostream>
#include <vector>
// Foo adds an element to a std::vector passed by reference
// on construction in the destructor
struct Foo {
Foo(std::vector<double>& v) : m_v(v){
}
~Foo(){
m_v.push_back(1.0);
}
std::vector<double>& m_v;
};
std::vector<double> bar(){
std::vector<double> ret;
Foo foo(ret);
return ret;
}
int main(){
std::cout << bar().size() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
在 gcc8.3 中,输出是1,这意味着foos 析构函数对返回的向量有影响。
在 MSVC14.1 中,输出是0. 您可以通过更换线路强制输出是一样的gcc8.3Foo foo(ret);与{Foo foo(ret);}(即通过强制的范围)。
我不认为这是悬空引用未定义行为(因为ret在之前声明 …
表达式fun和&fun类型是否相同?
请考虑以下代码:
template <typename Check, typename T>
void check(T)
{
static_assert(is_same<Check, T>::value);
}
void fun()
{}
check<void(*)()>(fun);
check<void(*)()>(&fun);
cout << typeid(fun).name() << endl;
cout << typeid(&fun).name() << endl;
Run Code Online (Sandbox Code Playgroud)
两个断言都成功,这表明两个表达式都具有相同的类型.然而,typeids返回不同的结果:
FvvE
PFvvE
Run Code Online (Sandbox Code Playgroud)
这是为什么?
鉴于以下代码,
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::any_of(std::begin(numbers), std::end(numbers),
[](int number) { return number > 3; } );
Run Code Online (Sandbox Code Playgroud)
std :: any_of需要(按标准),一旦达到4就返回?
假设我(在32位机器上)
enum foo {
val1 = 0x7FFFFFFF, // originally '2^31 - 1'
val2,
val3 = 0xFFFFFFFF, // originally '2^32 - 1'
val4,
val5
};
Run Code Online (Sandbox Code Playgroud)
val2,val4和val5的值是多少?我知道我可以测试它,但结果是标准化的吗?
我有以下代码:
namespace A {
struct Foo {
int a;
};
}
struct Foo {
int b;
};
struct Bar : public A::Foo {
Bar(Foo foo) {
c = foo.b;
}
int c;
};
Run Code Online (Sandbox Code Playgroud)
C ++编译器抱怨“ c = foo.b”,因为A :: Foo没有名为b的成员。如果我用:: Foo更改Bar参数的类型,它将起作用。
我的问题是此行为背后的原因是什么(我想这与继承使Bar进入A名称空间这一事实有关,但是我找不到任何文档来支持该理论。
c++ ×9
c++11 ×2
c ×1
c++14 ×1
clang ×1
compilation ×1
enums ×1
gcc ×1
inheritance ×1
java ×1
namespaces ×1
reflection ×1
stdarray ×1
stdvector ×1
stl ×1
template-argument-deduction ×1
templates ×1
types ×1