Boost logo

Boost :

From: wb_at_[hidden]
Date: 2001-06-13 23:28:56


David Abrahams <david.abrahams_at_[hidden]> wrote on Wed Jun 13 19:51:35 2001:

| ----- Original Message -----
| From: "Luis Pedro Coelho" <deepblack9_at_[hidden]>
|
| > template <typename T, T init = T()>
| > struct auto_init {
<snip>
| >
| > What do you think?
|
| I think it's nice, but would prefer to call the template "initialized".
| Also, I note that it /only/ works with built-in integer types. What about
| pointers and floating types? I think these deserve an "initialized" type as
| well.

As is so often the case, an extra level of indirection might serve to
grant your wish. The attached example employs a pointer-to-function as
the initializing entity; the pointee function is designed to produce
the actual initializer when provoked.

This example tests cleanly using KAI 4.0d under IRIX 6.5; I've not yet
had time to try this elsewhere and would certainly be interested to
hear of results in other environments.

        - WEB

// ======================================================================
//
// InitVia - proof-of-concept for auto-init'd values of arbitrary type
// using a pointer-to-function as a generalized initializer.
// Inspired by copyrighted code submitted to Boost by Luis Pedro Coelho.
//
// Copyright (c) 2001 Walter E. Brown.
//
// ======================================================================

#include <iostream>

// ----------------------------------------------------------------------
// InitVia<>:
// ----------------------------------------------------------------------

template< class T, T initVal() >
class InitVia {

public:
  InitVia() : val( initVal() ) {}
  void reset() { val = initVal(); }

  operator T & () { return val; }
  operator T const & () const { return val; }

  InitVia( T const & other ) : val( other ) {}
  InitVia & operator = ( T const & other ) { val = other; return *this; }

private:
  T val;

}; // InitVia<>

// ----------------------------------------------------------------------
// Tester:
// ----------------------------------------------------------------------

class Tester {

public:
  std::ostream & emit( std::ostream & os ) { return os << angle; }
  void half() { angle /= 2.0F; }

private:
  static float pi() { return 3.14159265F; }
  InitVia<float,pi> angle;

}; // Tester

// ----------------------------------------------------------------------
// myName():
// ----------------------------------------------------------------------

char * myName() { static char me[] = "W. E. Brown"; return me; }

// ----------------------------------------------------------------------
// main():
// ----------------------------------------------------------------------

int main() {

  Tester t; t.emit( std::cout ) << std::endl;
  t.half(); t.emit( std::cout ) << std::endl;
  InitVia<char *,myName> who; std::cout << who << std::endl;
  who = "nobody"; std::cout << who << std::endl;

} // main()


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk