Una cosa a tener en cuenta es que las plantillas C++ y los genéricos C# no son exactamente lo mismo. Consulte esto answer para obtener más detalles sobre esas diferencias.
En la página que vinculó para explicar los conceptos de C++ 0x, parece que la idea es que en C++ desee poder especificar que el tipo de plantilla implementa ciertas propiedades. En C#, la restricción va más allá y obliga al tipo genérico a ser "de" esa restricción. Por ejemplo, el siguiente código C#:
public GenericList<T> where T : IDisposable
dice que cualquier tipo utilizado en lugar de T debe implementar la interfaz IDisposable. Del mismo modo, el siguiente código:
public abstract class ABC {}
public class XYZ : ABC {}
public GenericList<T> where T : ABC
dice que cualquier tipo usado en lugar de la T debe ser de tipo ABC o derivados de ABC.
La idea del concepto C++ 0x solo dice que el tipo utilizado en lugar de T debe tener las mismas propiedades que las definidas por ABC (o IDisposable), no es que deba ser de ese tipo.
si vuela como un pato y grazna como un pato, entonces debe ser un pato? :-) – Zen
A menos que sea un * concepto * de pato. Parece haber una diferencia sutil en que C# impone el hecho de que el tipo debe ser de la restricción, mientras que un concepto simplemente dice que debe tener esas propiedades, pero no tiene que ser de ese tipo. –