2012-08-03 4 views
1

구조체 (객체의 순서가 아님)를 나타내는 멤버가있는 구조체를 만들 수 있기를 원합니다. 런타임 오버 헤드가 없어야하며 컴파일 타임에 서수를 사용할 수 있어야합니다.각 구조체에 고유 한 서수가 있음 보장

어떤 이유로 정적 변수는 컴파일 시간에 작동하지 않기 때문에 가장 단순한 방법은 작동하지 않습니다 다음 구조체가 생성되는 방법

int nextOrdinal() { 
    static int ordinal; 
    return ordinal++; 
} 

struct S1 { 
    enum ordinal = nextOrdinal(); 
} 

struct S2 { 
    enum ordinal = nextOrdinal(); 
} 

이 순간에 나에게 중요하지 않습니다. 문제는 컴파일 타임에 상태를 유지하는 것이 불가능한 것 같습니다. 맞습니까?

--Inspired by Boost.units dimensional analysis.

답변

2

은 컴파일 시간 (A CTFE 기능 내부의 아주 특별한 경우를 제외)에서 어떤 변수가 없습니다 - 모든 일정해야합니다. 또한 CTFE 변수를 정적으로 유지하고 해석 된 환경을 오염 시키면 꽤 좋은 디자인 선택이 될 것입니다.

일부 문제는 컴파일러가 다양한 코드 단위의 컴파일 순서를 (내 지식으로) 보증하지 않으며 (미래에) 조각을 병렬로 컴파일 할 수도 있다는 것입니다. 일반적으로 컴파일 타임 프로그래밍을 유연한 가변성 (CTFE 함수 내부)의 작은 주머니로 매우 엄격한 기능 환경으로 처리해야합니다. 일관성을 보장하기 위해 CTFE 가능 함수는 순수해야하며 "실행 된 식은 전역 변수 또는 로컬 정적 변수를 참조 할 수 없습니다." http://dlang.org/function.html#interpretation

요약하면 컴파일러에서이 상태를 저장할 수있는 방법이 없다고 생각합니다.

+0

사실 저는 컴파일러에 상태를 저장하는 방법이 없다고 생각하지만 실제로 컴파일 할 때 고유 한 서수를 구조체에 할당하는 방법이 있습니다. 나는 곧 나의 해결책을 게시 할 것이다. – Arlen

+0

프로그래머가 그 (것)들을 공급하는 경우에, 확실하십시오. 그리고 어쨌든 컴파일러가 유일성을 검사하는 것이 가능해야합니다 (예 : 동일한 이름의 동일한 모듈에있는 두 개의 구조체). –

+0

맞지만 struct와 함께 할 수는 없습니다. 왜냐하면 같은 이름을 가진 로컬 및 글로벌 구조체를 가질 수 있기 때문에 컴파일 타임 오류가 발생하지 않기 때문입니다. – Arlen

0

나는이 작업을 수행 할 수있는 신뢰할 수있는 방법을 알고하지 않습니다,하지만 당신은 주문하려는 경우 그들이 당신이 할 수있는 소스 파일의 위치에 따라 :

import std.conv; 
import std.stdio; 

size_t nextOrdinal(size_t line = __LINE__)() 
{ 
    return line; 
} 

struct S1 { 
    enum ordinal = nextOrdinal(); 
} 

struct S2 { 
    enum ordinal = nextOrdinal(); 
} 

void main() 
{ 
    writeln(S1.ordinal); 
    writeln(S2.ordinal); 
} 

여러 개의 파일이있는 경우를 그 nextOrdinal을 호출하면 동일한 서수 값을 갖는 구조체 정의로 끝날 수 있습니다.

+0

같은 줄에 여러 구조체가 정의되어있어 작동하지 않습니다. 그러나 나는 나중에 게시 할 수있는 해결책을 가지고있다. 사용자에게 서수를 제공 할 것을 요청하고 서수가 전에 사용 된 경우에는 컴파일 타임 오류가 발생합니다. – Arlen

+1

모든 것을 자동으로하고 싶다고 생각했습니다. 같은 줄에 여러 struct 정의를 쓰는 사람은 누구인지 모르겠다. :) –

관련 문제