作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想添加一个成员函数,以防我的类的最后一个模板参数被明确设置为某个值。我不明白如何重用以前定义的代码。
我想要编译的简化示例:
template <int A, int B, int C>
struct S
{
void fun() {}
};
template <int A, int B>
struct S<A,B,0>
{
void fun1() {}
};
template <int A>
struct S<A,0,0>
{
void fun2() {}
};
int main()
{
S<0,0,0> s;
s.fun();
s.fun1();
s.fun2();
return 0;
}
我需要用 C++03 编译器找到一个解决方案。
最佳答案
实际上,您的特化是非特化,因为它不特化任何主模板的参数:
template<int A, int B>
struct S<A,B> // ...
// ^^^
// Does not really specialize the primary template,
// no specialized pattern is introduced here
你可以尝试这样重写它:
template<int A> // <== Only the first template parameter of the primary
// template is unconstrained in the pattern we want to
// express (the second template argument shall be 1)
struct S<A,1> : public S<A,0>
// ^^^ ^
// Specializes! Something meaningful should go here,
// but that actually depends on the real
// class templates you are using and their
// semantics
{
void fun1() {}
};
作为替代方案,如果您的目标只是有条件地添加一个成员函数,您可以使用如下所示的 SFINAE 约束而不是专门化:
#include <type_traits> // <== Required for std::enable_if<>
template <class T = void>
// ^^^^
// The function's return type here
typename std::enable_if<B == 1, T>::type
// ^^^^^^
// Your condition for the function's existence
fun1()
{
// ...
}
这是一个live example演示此技术。
关于c++ - 部分类模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16166547/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!