C++ 使用CRTP技术确保模板参数的唯一性

C++ 使用CRTP技术确保模板参数的唯一性,c++,template-meta-programming,C++,Template Meta Programming,从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<

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

啊哈,我相信我有

答案在本节中:

/// Register this ordinal /// INTERNAL ONLY friend detail::yes boost_units_is_registered(const units::base_dimension_ordinal&) { return(detail::yes()); } /// But make sure we can identify the current instantiation! /// INTERNAL ONLY friend detail::yes boost_units_is_registered(const units::base_dimension_pair&) { return(detail::yes()); }
或类似的。最终,目标实现了:您无法使用具有相同模板参数值的两个类实例编译代码。胡萨

啊哈,我相信我有

答案在本节中:

/// Register this ordinal /// INTERNAL ONLY friend detail::yes boost_units_is_registered(const units::base_dimension_ordinal&) { return(detail::yes()); } /// But make sure we can identify the current instantiation! /// INTERNAL ONLY friend detail::yes boost_units_is_registered(const units::base_dimension_pair&) { return(detail::yes()); }
或类似的。最终,目标实现了:您无法使用具有相同模板参数值的两个类实例编译代码。胡萨

您知道在哪里定义了
detail::yes
detail::no
?我一直在试图通读这方面的Boost源代码,但我想我和你一样感到困惑。@DragoonWraith
detail::yes
detail::no
都在
prevent\u redefinition.hpp
文件中。它们就是这样!我因为错过了他们而感到很傻。六羟甲基三聚氰胺六甲醚。。。好的,我会继续查找,看看是否得到它。你知道
detail::yes
detail::no
是在哪里定义的吗?我一直在试图通读这方面的Boost源代码,但我想我和你一样感到困惑。@DragoonWraith
detail::yes
detail::no
都在
prevent\u redefinition.hpp
文件中。它们就是这样!我因为错过了他们而感到很傻。六羟甲基三聚氰胺六甲醚。。。好吧,我会继续看,看我是否明白。对不起,你没有说任何我不知道的话,我仍然不知道
boost\u units\u是如何在
base\u维度中注册的。是的,我知道有人给它打电话,这让整件事顺利进行,但是怎么做呢?我不能直接调用它(实例化它);你怎么称呼它?@Arlen:啊,我的道歉,这还不清楚。我更新了一些答案,试图澄清。让我知道这是否能解释你的问题。对不起,你没有说任何我不知道的话,我仍然不知道
boost\u units\u是如何在
base\u dimension
中注册的。是的,我知道有人给它打电话,这让整件事顺利进行,但是怎么做呢?我不能直接调用它(实例化它);你怎么称呼它?@Arlen:啊,我的道歉,这还不清楚。我更新了一些答案,试图澄清。如果这能为你解释问题,请告诉我。
detail::ordinal_has_already_been_defined<check_base_dimension<Derived, N>::value> does not have a member variable 'type'