小编Thr*_*ton的帖子

Python 类型提示联合

我有一个带有两个参数的函数:

def same_type_params(param1: Union[str, int], param2: Union[str, int]):
    pass
Run Code Online (Sandbox Code Playgroud)

如何限制 和 的类型param1相等param2?即两者str或两者int

python type-hinting python-3.x

3
推荐指数
1
解决办法
1227
查看次数

列表理解中的缓存变量

假设我有一个昂贵的操作expensive(x: int) -> int和以下列表理解:

# expensive(x: int) -> int
# check(x: int) -> bool
[expensive(i) for i in range(LARGE_NUMBER) if check(expensive(i))]
Run Code Online (Sandbox Code Playgroud)

如果我想避免expensive(i)为每个运行两次i,有什么方法可以通过列表理解来保存它的值?

python performance list-comprehension dictionary-comprehension set-comprehension

1
推荐指数
1
解决办法
231
查看次数

C++ 可变参数模板产品

我正在为在不同容器类型上运行的库编写测试平台,即

std::vector<int>
std::vector<char>
std::vector<bool>
std::list<int>
# etc
Run Code Online (Sandbox Code Playgroud)

我想通过基本上做std::vector, std::list, std::forward_listwith的交叉产品来自动生成测试,<bool, char, int>并且还按照容器类型的顺序生成测试。

我正在考虑用模板包做一些事情:

template <class C> 
void register_containers() {
    std::string container_name = demangle(typeid(C).name());
    benchmark::RegisterBenchmark(container_name.c_str(), BM_Func, ArgObj());
}

template <class C, class C2, class... Args> 
void register_containers() {
    std::string container_name = demangle(typeid(C).name());
    benchmark::RegisterBenchmark(container_name.c_str(), BM_Func, ArgObj());
    register_containers<C2, Args...>();
}


template<class T> 
constexpr void register_types() {
    register_containers<std::list<T>, std::vector<T>>();
    return;
}

template <class T,class T2, class... Args> 
constexpr void register_types() {
    register_containers<std::list<T>, std::vector<T>>();
    register_types<T2, Args...>();
}

int main(int argc, char** …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

1
推荐指数
1
解决办法
77
查看次数

递归模板包

我在递归模板包解包方面遇到了麻烦。我目前拥有的是:

template<T> 
constexpr void register_types() {
    do_something<T>();
    return;
}

template <class T, T2, class... Args> 
constexpr void register_types() {
    do_something<T>();
    register_types<T2, Args...>();
}


int main(int argc, char** argv) {
    register_types<unsigned char, unsigned short, unsigned int, unsigned long long int>();
Run Code Online (Sandbox Code Playgroud)

但是我想要一个更空的基本案例,比如

template<> 
constexpr void register_types() {
    return;
}

template <class T, class... Args> 
constexpr void register_types() {
    do_something<T>();
    register_types<Args...>();
}
Run Code Online (Sandbox Code Playgroud)

但是,这给了我错误:

src/benchmarks/benchmark_main.cc:68:31: error: ‘register_types’ is not a template function

是否可以将空参数包作为基本情况?我看过这篇文章,但希望尽可能避免使用 SFINAE。

c++ parameters templates

0
推荐指数
1
解决办法
51
查看次数

automake 将目标文件放在库之后

src/Makefile.am

myproj_CXXFLAGS = -fopenmp -O3 -std=c++17 -g -I/home/software/miniconda3/include -I$(top_srcdir)/external
myproj_LDFLAGS = -L/home/software/miniconda3/lib -Wl,-rpath=/home/software/miniconda3/lib -fopenmp -lz -ligraph -pthread 
bin_PROGRAMS = myproj
myproj_SOURCES = gfa.cpp  graph.cpp myproj.cpp gfa.h  graph.h
bindir = $(top_srcdir)/bin
Run Code Online (Sandbox Code Playgroud)

这很好地构建了目标文件,但是在构建目标时,它会尝试运行

g++ -fopenmp -O3 -std=c++17 -g -I/home/software/miniconda3/include -I../external -g -O2 -L/home/software/miniconda3/lib -Wl,-rpath=/home/software/miniconda3/lib -fopenmp -lz -ligraph -pthread   -o myproj myproj-gfa.o myproj-graph.o myproj-komb.o 
Run Code Online (Sandbox Code Playgroud)

这个问题是目标文件在库文件之后,这会导致错误

/home/software/miniconda3/lib/libz.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我可以通过-lz -ligraph在最后添加标志来轻松解决这个问题,但是我怎样才能让 automakeLDFLAGS在目标文件之后而不是之前添加呢?

automake gcc makefile g++ autotools

0
推荐指数
1
解决办法
23
查看次数