草庐IT

c++ - 存储类初始化的模板

coder 2024-02-23 原文

我想知道如何存储我的模板,我写一个例子:

class cDebugInfo
{
private:
    DWORD * address;
    string name;
    template Type;

public:
    Type GetFormattedValue()
    {
        return *(Type*)address;
    }
    cDebugInfo(){}
    template <class T>
    cDebugInfo(DWORD Address, string Name){
        address = Address;
        name = Name;
        Type = T;
    }
};

我的目标是能够向我的数组中添加一个项目:

std::vector<cDebugInfo>DebugItems;

template <class T>
void AddItem(std::string name, DWORD Address)
{
    DebugItems.push_back(cDebugInfo(Address, name));
}
cDebugInfo* GetItemByNameP(std::string name)
{
    for (int i = 0; i < DebugItems.size(); i++)
    {
        if (DebugItems[i].name == name)
        {
            return &DebugItems[i];
        }
    }
}

所以我像这样将项目添加到我的数组中:

AddItem<int>(0x1337, "Test");
AddItem<string>(0x1337, "Test2");

因此能够调用:

GetItemByName("Test")->GetFormattedValue();

这应该返回从给定地址读取的 INT 值,因为当我添加项目时传递的模板是一个 int。当然,以下应该返回存储在我的指针指向的地址中的值作为字符串:

GetItemByName("Test2")->GetFormattedValue();

我需要它来“记住”传递给类(class)的模板。 注意:当我将 GetItemByName 与模板一起使用时,其他一切工作正常,但问题是我不知道当我得到它们时它是什么模板,只有当我添加它们时。 谢谢。

最佳答案

您所要求的是不可能的,因为 C++ 中的每个表达式在编译时都必须具有已知类型。考虑一下:

auto value = GetItemByName("BestItem")->GetFormattedValue();

GetItemByName(...) 给我一个 cDebugInfo*,但是 GetFormattedValue() 给我什么?这对于每个 cDebugInfo* 都必须是相同的类型,这样上面的表达式才能有效,所以该类型不能保留到运行时。所以一般的解决方案是不可能的。

但是,您可以根据自己的需要添加特定的解决方案。假设我们只想打印格式化的值。我们可以这样做:

class cDebugInfo {
    std::function<void()> printer; // type-erased functor
    ...
public:
    template <class T>
    cDebugInfo(DWORD Address, string Name){
        address = Address;
        name = Name;
        printer = [this]{
            std::cout << "Value as " << typeid(T).name() << ": "
                      << *reinterpret_cast<T*>(address) << '\n';
        };
    }
};

这种方法称为“类型删除”。在这种情况下,lambda“存储”类型 T,但类本身只需要知道它是一个返回 void 的 nullary 函数。我们可以通过以下方式公开:

void printValue() { printer(); }

这样:

GetItemByValue("BestItem")->printValue();

将根据构造值的类型正确打印值。

关于c++ - 存储类初始化的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29672320/

有关c++ - 存储类初始化的模板的更多相关文章

  1. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  5. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  6. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  7. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  8. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  9. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  10. ruby-on-rails - Mandrill API 模板 - 2

    我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h

随机推荐