static_assert 似乎是一个非常好的功能与模板.
但是,我无法在标准库中查找函数,以便在编译时进行各种测试.
例如,我正在寻找一个函数来检查类型是否是另一个类型的子类型.boost::is_base_of但是,这项工作在std中是一个类似的功能,所以我不需要依赖boost.
基本上,是否有一个很好的源代码可以在static_assertC++ 11的标准库中使用并包含在函数列表中?
什么时候static_assert执行?我可以将它放在模板中的任何位置,并针对每个模板实例进行评估吗?它可以用来将模板参数约束为类的特定子类型吗?
对不起,如果这是一个骗局.有许多类似的问题,但似乎没有人真正解决这个问题.他们都有点不同.
所以我想要实现的目标:考虑一个模板类X<T>.现在,我想要一个额外的构造函数为该模板的特定instanciattion延伸,让我们说指针X<T*>.我不想创建一个完整的模板规范X<T*>,因为它X<T*>应该与通常的模板完全一样(并且该模板是巨大的,因此复制粘贴将是一个相当重复的代码复制气味),只是它有一个额外的构造函数.我也不想X<T*>继承,X<T>因为我不想在这两者之间建立子类型关系.这可能吗?我试过这样的:
template<T> class X{};
template<T> X<T*>::X(int i){...}
Run Code Online (Sandbox Code Playgroud)
但它没有编译.这有点可能吗?
从模板类继承时,我需要为派生类中访问的所有基类成员添加前缀this:
template<typename T>
struct X{
int foo;
void bar();
};
template<typename T>
struct Y : public X<T> {
void blub(){
foo++; // Does not work
this->foo++; // Fine
bar(); // Does not work
this->bar(); // Fine
}
}
Run Code Online (Sandbox Code Playgroud)
正如我所暗示的那样,你必须在会员面前添加前缀的原因this已在此处得到解答.所以我剩下的问题是:有没有办法避免所有的thises?例如,我在派生类中有一个使用大量基类成员的方法.代码看起来完全混乱了所有this->内容.有没有办法省略这些?
假设我有以下代码:
namespace x{
class X{
virtual void x(){}
}
}
namespace y{
class Y : public x::X{
void x(){}
}
}
int main(){
x::X* a = new y::Y();
a->x::X::x(); //Tries to access x::X::x non-virtually.
//Fails, since it treats the first x as the
//function name instead of the namespace
}
Run Code Online (Sandbox Code Playgroud)
如您所见,main方法的最后一行尝试静态调用类x :: X的x方法(即非虚拟).但是,这会失败,因为命名空间与方法具有相同的名称(两者都命名为x).因此,编译器将第一个x视为方法名称,然后抱怨x :: X没有任何意义.
这个问题在初看起来似乎是假设的,但它确实出现在我们的代码中:命名空间不能轻易地重命名,因为它是一个大项目的命名空间.方法名称无法更改,因为它必须遵守我们的范围之外的其他超类(库类).
那么,有没有机会以某种方式消除这种语法的歧义,以便我仍然可以非虚拟地调用方法x :: X :: x?
现在,我看到的唯一解决方案是x = X,然后使用typedef.有没有typedef的解决方案吗?
我test在类中有一个静态模板方法,A它接受一个bool模板参数.当我尝试像这样调用函数时:
x = A::test<true>(...);
Run Code Online (Sandbox Code Playgroud)
解析器抱怨,因为它将<less视为小于运算符.我怎样才能告诉编译器这是一个模板实例而不是一个oprator呢?
c++ ×5
templates ×3
c++11 ×2
assertions ×1
constructor ×1
methods ×1
namespaces ×1
parse-error ×1
parsing ×1