作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用以下编译时“技巧”(基于 ADL)来创建一个仅由同一命名空间中的类有效/定义/调用的函数。
namespace Family1
{
struct ModelA{};
struct ModelB{};
template<typename T>
bool is_in_Family1(T const& t)
{
return true;
}
};
namespace Family2
{
struct ModelC{};
template<typename T>
bool is_in_Family2(T const& t)
{
return true;
}
};
Family1::ModelA mA;
Family2::ModelC mC;
is_in_Family1(mA); // VALID
is_in_Family1(mC); // ERROR
现在,我想使用这个原则(或类似的东西)来为属于每个命名空间的类生成 Foo::Bar
(如下)的特化,例如家庭 1
。
// I would like to specialize the method template Bar for classes in Family1
// namespace; and another specialization for classes in Family2 namespace
struct Foo
{
template<typename T>
void Bar( T& _T ){}
};
为了便于维护和每个命名空间中的大量类,如果可能的话,我希望在执行此检查时不命名命名空间中的所有类。
最佳答案
你的“把戏”有一个大问题。尝试调用 is_in_Family1(make_pair(Family1::ModelA(), Family2::ModelC())
你会看到返回 true
,因为 ADL 将查看 ModelA
的两个命名空间和 ModelC
(因为 pair<ModelA, ModelC>
)。
忽略这个问题,使用你的函数很简单。
template<typename T> struct int_ { typedef int type; };
struct Foo
{
template<typename T,
typename int_<decltype(is_in_Family1(*(T*)0))>::type = 0
>
void Bar( T& t ){}
template<typename T,
typename int_<decltype(is_in_Family2(*(T*)0))>::type = 0
>
void Bar( T& t ){}
};
调用 Bar
取决于它是在 family2 还是 family1。
struct Foo
{
template<typename T,
typename int_<decltype(is_in_Family1(*(T*)0))>::type = 0
>
void Bar( T& t, long){}
template<typename T,
typename int_<decltype(is_in_Family2(*(T*)0))>::type = 0
>
void Bar( T& t, long){}
template<typename T>
void Bar( T& t, int) {}
template<typename T>
void Bar( T& t ) { return Bar(t, 0); }
};
那个也有一个通用的后备。并且您的代码具有未定义的行为,因为您使用了保留名称。不要使用 _T
.
关于c++ - 为命名空间中的类特化方法模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9007584/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!