- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个类层次结构,其中基类包含一个函数,该函数根据接收到的参数测试 dynamic_cast
将 this
指针转换为派生模板类型。
问题是 dynamic_cast
运算符会检查参数是否完全匹配,同时考虑它们是否为 ref。我需要以下示例来处理这两种情况,有没有办法做到这一点?
template <typename... P>
struct Derived;
struct Base
{
virtual ~Base() {}
template <typename... P>
void doCast(P&&... p) {
Derived<P...> *res=dynamic_cast<Derived<P...> *>(this);
if (!res)
std::cout<<"Failed."<<std::endl;
else {
std::cout<<"Success."<<std::endl;
res->doSomethingWithP(std::forward<P>(p)...);
}
}
};
template <typename... P>
struct Derived: public Base
{
void doSomethingWithP(P... p) {
/*Whatever, doesn't matter*/
}
};
int main(int argc, char **argv)
{
Derived<int, int, int> derived;
Base *b=&derived;
int x=10;
int y=20;
int z=30;
//The two calls must succeed.
b->doCast(x,y,z); //Failed.
b->doCast(10,20,30); //Success.
return 0;
}
Derived
可以接受同时是值、引用和指针的类型 - cv - 限定或不限定。
最佳答案
只是将我的评论移至答案。在典型情况下,如果两个 Derived<int>
和 Derived<int const&>
允许作为类型,Base::doCast
可能必须为每个参数类型执行两个不同的转换,或者 2^N
总 Actor 。这是不可行的。
但是,您可以改为 (1) 要求 Derived
的模板参数不是引用,并且 (2) 让它通过引用获取其参数。所以我们只删除所有 P
的引用小号:
template <typename... P>
void doCast(P&&... p) {
if (auto res = dynamic_cast<Derived<std::remove_reference_t<P>...>*>(this)) {
std::cout << "Success." << std::endl;
res->doSomethingWithP(p...); // NOT forward
}
else {
std::cout << "Failed." << std::endl;
}
}
并在另一边引用,这样我们就不会产生额外的拷贝:
template <typename... P>
struct Derived: public Base
{
void doSomethingWithP(P&... ) {
/*Whatever, doesn't matter*/
}
};
然而,这仍然让我们做出Derived<int&>
,这将永远在此模型中工作。因此,让我们明确禁止这样做。首先是一些样板文件:
template<bool...> struct bool_pack;
template<bool f, bool... bs>
using all_same = std::is_same<bool_pack<bs..., f>, bool_pack<f, bs...>>;
template <bool... bs>
using none = all_same<false, bs...>;
然后:
template <typename... P>
struct Derived: public Base
{
static_assert(none<std::is_reference<P>::value...>::value,
"Can't make Derived with references");
...
};
关于c++ - 如何 dynamic_cast 参数中带有不匹配引用修饰符的可变参数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434403/
SQL FMDB 的修饰符在哪里描述?特别是,如何在要插入的字符串中放置引号。比如我想将名称“Mac's Place”插入数据库?谢谢 最佳答案 如果在 SQL 中使用 executeUpdate 和
我读过 article在 MSDN 上。它解释了为什么“in”应该只与自定义只读结构一起使用,否则会有性能损失。但是,我不太明白如何对原始类型使用“in”。由于 C# 中的所有内置值类型都是不可变的,
“__printflike__ 修饰符”到底是什么?这个词是什么意思? 最佳答案 据推测,它会告诉编译器您正在使用的函数接受格式为 [anything, ] format, ... 的参数,其中 fo
我在 VS2010 上使用 ReSharper 插件,我正在生成一个接口(interface)方法。ReSharper 在参数名称上放置一个 @。那是做什么用的? int Count(Func @wh
我在写小偷中用了大量的正则,所以在接下来的版本中要逐步减少正则的应用 在PHP正则表达式中需要转义的字符如下: $^*()+={}[]|/:<>.?'" 注意:perl风
http://msdn.microsoft.com/en-us/library/435f1dw2.aspx public class Base { public string Field; }
根据scala-wartremover静态分析工具我必须将“final”放在我创建的每个案例类前面:错误消息显示“案例类必须是最终的”。 根据scapegoat (Scala 的另一个静态分析工具)相
在 tcsh 中,我可以通过以下方式从路径末尾提取第二个路径元素 cd /some/long/directory/structure/path/ set x=`pwd` echo ${x:h:h:t}
我找到了很多 SwiftUI 教程,其中修饰符 .resizable() 用于图像。它似乎不再适用于带有 Swift 5 的 Xcode 13.3.1。 导入了 SwiftUI。如果您自己键入整个修饰
我已经设置好了音频播放器 除了步进器的当前功能外,我还想为 onIncrement 和 onDecrement 播放单独的声音。 这个项目使用核心数据来持久化。 $estimatorData.qty
来自 linux 内核脚本/mod/modpost.c: static int is_vmlinux(const char *modname) { const char *myname;
我刚刚遇到了一个BNF Grammar for JAVA 。其中,“修饰符”有一个称为“threadsafe”的终结符号。但是,我以前从未见过它,也无法在《Java 语言规范》Java SE 7 版
我创建了一个脚本,它将我组中的所有帖子嵌入到我的网站上。为此,我必须知道所有可能的修饰符“附件”类型。 现在我知道,那个类型可以是: 分享, video_share_youtube。 但我不知道在哪里
在 tcsh 中,我可以通过以下方式从路径末尾提取第二个路径元素 cd /some/long/directory/structure/path/ set x=`pwd` echo ${x:h:h:t}
我找到了很多 SwiftUI 教程,其中修饰符 .resizable() 用于图像。它似乎不再适用于带有 Swift 5 的 Xcode 13.3.1。 导入了 SwiftUI。如果您自己键入整个修饰
我正在编写一个代表一些简单几何形状的 Java 类。 最上面abstract类(它本身是包私有(private))我已经声明了需要从同一包中的子类访问的属性。 如果我将属性声明为 final在 Abs
我已经设置好了音频播放器 除了步进器的当前功能外,我还想为 onIncrement 和 onDecrement 播放单独的声音。 这个项目使用核心数据来持久化。 $estimatorData.qty
明确地说,我是 不是 询问如何使用 ViewModifier 协议(protocol)来创建一个带有 body 函数的结构,然后可以使用它来修改 View 。这个问题有点不同。 我正在尝试创建 Nav
我有一个内部类,用于存储我用于游戏的控件的信息,现在我想在其中存储一个静态 ArrayList,其中包含所有控件的名称。但我收到此错误:“修饰符 static 只允许在常量变量声明中” private
public class This_testing { int x,y; public This_testing(int x,int y){ //Why modifier void
我是一名优秀的程序员,十分优秀!