Cómo evitar violar ODR con clases de rasgos

Al leer el código en línea de las bibliotecas de producción, encontré algo como esto

Traits.hpp

template <typename Type>
class Traits {
    template <typename T, 
              detail::EnableIfIsInstantiation<T, Type>* = nullptr>
    static void foo(T& object) { 
        object.foo();
    } 
};

SpecialTraits.hpp

template <>
class Traits<Special> {
    static void foo(Special& object) {
        object.foo();
    }
    static void foo(Special&& object) {
        object.special_foo();
    }
};

Esto causará una violación de ODR si una biblioteca crea una instancia de un tipo que usaTraits paraSomething en una unidad de traducción sin incluirSpecialTraits.hpp y luego crea una instancia de un tipo que usa los rasgos especializados en otra unidad de traducción. Esto causaría una violación de ODR cuando esas dos unidades de traducción están vinculadas entre sí.

¿Cuál es la forma sugerida de evitar este problema? ¿Tengo que recurrir a incluir todas las especializaciones en el originalTraits.hpp ¿archivo? ¿Y qué pasa si no se me permite editar el archivo con la definición deSpecial?

Nota Por favor ignore el hecho de quefoo() podría haber sido especializado porSpecial en sí mismo en el&& caso. No podría pensar en un mejor ejemplo ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta