일부 라이브러리 코드를 작성 중이므로 가능한 경우 사용자가 정적 바인딩을 이용할 수 있기를 바랍니다. 클래스를 컴파일 할 때 클래스를 인스턴스화 할 수 없으면 클래스의 동적 버전이 있어야 런타임에 인스턴스화 할 수 있습니다. 동적클래스의 정적/동적 바인딩 버전을 생성 할 수있는 템플릿이 있습니까?
template<bool dynamic, int value=0> struct A
{
static const int Value = value;
};
template<> struct A<true>
{
int Value;
A(int value) : Value(value) {}
};
이러한 정의는 라이브러리의 사용자가 정적을 인스턴스화 할 수 있으며 : 빠른 예를 들어
, 나는 구조 템플릿 A를 갖고 있다고A<true> dynamicA = A<true>(5);
A<false, 5> staticA;
이의 문제 방법은 클래스의 정의를 두 번 써야한다는 것입니다. 두 버전을 직접 생성 할 수있는 템플릿을 구현하는 몇 가지 방법을 생각해 볼 수 있지만 많은 작업이 될 수 있습니다. 이 패턴/문제에 대한 이름
// It would be much harder to generate a static version of this class,
// though it is possible with type lists. Also, the way I'm imagining it,
// the resulting classes probably wouldn't be very easy to use.
struct A
{
vector<int> Values;
A(vector<int> value) : Values(value) {}
};
있습니까 : 특히 예를 들어, 매개 변수의 숫자를 다양한 사용하는 것이 클래스? 나에게 정의를 생성 할 수있는 템플릿을 가진 메타 프로그래밍 라이브러리가 있습니까? 수업의 정의를 두 번 쓰지 않아도되는 방법은 무엇입니까?
내가이 상황에서 "정적 바인딩"로 무슨 뜻인지 이해가 잘 모르겠어요; 'constexpr auto pseudostatic = A (5);의 무엇이 잘못 되었습니까? –
dyp
특정 클래스가 런타임에 인스턴스화되었는지 여부를 어떻게 감지합니까? – wowofbob
dyp의 해결책이 직접적으로 적용 가능하지 않더라도'constexpr'은 아마 문제를 피할 수있는 열쇠 일 것입니다. 'A'를 템플릿으로 만들지 않아도됩니다. – MSalters