差出人boost::units
:
struct my_base_dimension1 : units::base_dimension<my_base_dimension1, 1> { }; // ok
struct my_base_dimension2 : units::base_dimension<my_base_dimension2, 2> { }; // ok
struct my_base_dimension3 : units::base_dimension<my_base_dimension3, 2> { }; // error
私は、コードがテンプレート引数が一意であることをどのように保証するかを理解しようとしています。check_base_dimension
がトリガーされるゼロ以外の値を返す方法がわかりませんordinal_has_already_been_defined<true>
。boost_units_is_registered()
で再定義されたことと関係があると思いますが、バージョンがbase_dimension
どのように呼び出されるのかわかりません。friend
何か案は?
base_dimension.hpp
問題のファイルはとですprevent_redefinition.hpp
。
template<class Derived, long N,
class = typename detail::ordinal_has_already_been_defined<
check_base_dimension<Derived, N>::value
>::type
>
class base_dimension : public ordinal<N>
{
public:
typedef base_dimension this_type;
typedef list<dim<Derived,static_rational<1> >, dimensionless_type> dimension_type;
typedef Derived type;
private:
friend Derived*
check_double_register(const units::base_dimension_ordinal<N>&)
{ return(0); }
friend detail::yes
boost_units_is_registered(const units::base_dimension_ordinal<N>&)
{ detail::yes result; return(result); }
friend detail::yes
boost_units_is_registered(const units::base_dimension_pair<Derived, N>&)
{ detail::yes result; return(result); }
};