On Tuesday, 5 June 2012 at 05:39:34 UTC, Ali Çehreli wrote:
On 06/04/2012 06:22 PM, Chang Long wrote:

> The previous two example is not correct, please see this one:

Your post sounds interesting but there are lots of errors:

> size_t line l;  <-- ERROR

> void this(string name) { <-- ERROR

etc. Can you actually compile that code?

It would be better if you can present your question with less code.

Ali
this is what I mean, I can't make it more smaller.
-----------------------------------------------------------
abstract class Template_parameter_Base{
        TypeInto ti;
        string name ;
        this(TypeInto ti, string name) {
            this.ti = ti ;
            this.name = name ;
        }
}
class Template_parameter(T) : Template_parameter_Base {
        T   value ;
        alias value this;
        void assign(ref T t){
                value = t ;
        }
}
class Template_Engine {
        string name ;
        Template_parameter_Base[string] parameters ;
        void this(string name) {
                this.name = name ;
        }
}
class Template(string name) {
static compile_time_mutable(Template_Engine) engine = new Template_Engine!name ;
        void assign(string name, T)(ref T t){
                static if(name in vars) {
static const parameter = cast(Template_parameter!T) engine.parameters[name];
                        static assert( parameter.ti == typeid(T) );
                } else {
static const parameter = new Template_parameter!T(typeid(T), name) ;
                        static engine.parameters[name]          =  parameter ;
                }
                parameter.assign(t);
        }
}
void main(){
        static tpl = new Template!"home_page" ;
        auto  is_login  =  false ;
        tpl.assign!"is_login"( is_login) ) ;
        if( is_login ) {
                tpl.assign!"user"( new User() ) ;
        }
        
        auto string switch_user = "new_user_email" ;
        if( switch_user !is null ) {
                tpl.assign!"user"( new User(switch_user) ) ;
        }
        
        tpl.assign!"user"( true )  ; // static assert error
}
-----------------------------------------------------------

After think what is done, a better way is put the Template_parameter on the annotation data section.

some things like this:
class Template_Engine(string name) {
     static this_ti =  typeid( typeof(this) ) ;
     void assign(string name, T)(ref T t){
static const parameter = new Template_parameter!(T, name) ; ti.createAnnotation("Template_Engine_Parameter", parameter);
            parameter.assign(t);
      }
      void render(){
auto parameters = this_ti.getParametersByName("Template_Engine_Parameter") ; // compile template to dynamic link library by template file and parameters
     }
}

Reply via email to