, 당신은 속일 수 있습니다.
// invokes target<i>{}() if i >= min and i < max
template<template<size_t>class target, size_t max, size_t min=0>
struct magic_switch {
void operator()(size_t i) const {
constexpr size_t mid = (min+max-1)/2;
if (i==max-1) target<max-1>{}();
else if(i<mid) magic_switch<target, mid,min>{}(i);
else magic_switch<target, max-1,mid>{}(i);
}
};
template<template<size_t>class target, size_t min>
struct magic_switch<target, min, min> {
void operator()(size_t i) const {} // do nothing
};
int number;
template<size_t len>
struct program {
template<size_t number>
struct p2 {
void operator()() const {
std::bitset<len> arr[number];
// code
}
};
void operator()() const {
magic_switch<p2, 1001, 1>{}(number);
}
};
int main(int argc, char const* argv[]) {
int len;
if (argc == 3)
{
len = atoi(argv[1]);
number = atoi(argv[2]);
}
magic_switch<program, 1001, 1>{}(len);
}
물론이 접근법은 완전히 나쁜 생각입니다.
기본적으로 각 len x 숫자에 대해 하나씩 10000000 개의 프로그램을 만들었고, 어느 프로그램을 실행할지 결정하기 위해 거대한 체인을 만들었습니다.
이것은 프로그램에 대한 포인터를 배열에 저장 한 다음 20 회의 재귀 대신 배열 조회를 수행하면 더 효율적으로 만들 수 있습니다. 여전히 나쁜 생각입니다.
이 솔루션을 사용하지 마십시오. 왜 그것을 사용하지 말아야하는지 이해하지 못한다면, 나를 믿으십시오. 왜 사용하지 말아야하는지 이해한다면,이 단락은 중복됩니다.
더 빠른 magic_switch
(일부 컴파일러는 그것을 좋아하고, C++ 14 개 기능을 사용하지 않습니다),
여기
template<template<size_t>class target, size_t max, size_t min=0>
struct magic_switch {
template<size_t...Is>
void operator()(std::index_sequence<Is...>, size_t i) {
using task = void(*)();
static const task arr[] = {
[]{ target<min+Is>{}(); }...
};
arr[i-min]();
}
void operator()(size_t i) const {
(*this)(std::make_index_sequence<max-min>{}, i);
}
};
우리는 (A static const
배열) 점프 테이블을 구축, 조회 작업을 수행하고 그것을 실행하십시오./걸릴 인수를 반환하는이 확장
는 상대적으로 쉽다 다음 number
변수가 세계적으로 저장 요구 사항을 멀리 걸릴 것이 하나를 사용
template<class Sig, template<size_t>class target, size_t max, size_t min=0>
struct magic_switch;
template<class R, class...Args, template<size_t>class target, size_t max, size_t min>
struct magic_switch<R(Args...), target, max, min> {
template<size_t...Is>
R operator()(std::index_sequence<Is...>, size_t i, Args&&...args) {
using task = R(*)(Args&&...);
static const task arr[] = {
[](Args&&...args)->R{
return target<min+Is>{}(std::forward<Args>(args)...);
}...
};
return arr[i-min](std::forward<Args>(args)...);
}
R operator()(size_t i, Args...args) const {
return (*this)(
std::make_index_sequence<max-min>{},
i,
std::forward<Args>(args)...
);
}
};
. 전역 변수가 나쁜 습관이기 때문에 코드가 향상됩니다.
답장을 보내 주셔서 감사합니다. 성능 때문에 비트 세트를 사용해야합니다.하지만 Vector로 전환하고 문제를 해결하는 것이 더 좋습니다. 어쨌든 감사합니다. – Am1rr3zA
@ am1rr 나는 상대적인 성능에 대해 잘못된 가정을하고 있다고 생각한다. – Yakk
과용과 같은 킬은 없다. – David