我有一个带有两个参数的函数:
def same_type_params(param1: Union[str, int], param2: Union[str, int]):
pass
Run Code Online (Sandbox Code Playgroud)
如何限制 和 的类型param1相等param2?即两者str或两者int
假设我有一个昂贵的操作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
我正在为在不同容器类型上运行的库编写测试平台,即
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) 我在递归模板包解包方面遇到了麻烦。我目前拥有的是:
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。
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在目标文件之后而不是之前添加呢?
c++ ×2
python ×2
templates ×2
automake ×1
autotools ×1
c++11 ×1
g++ ×1
gcc ×1
makefile ×1
parameters ×1
performance ×1
python-3.x ×1
type-hinting ×1