【问题标题】:C++ function template causing input arguments to errorC++ 函数模板导致输入参数出错
【发布时间】:2012-06-05 06:17:49
【问题描述】:

如何创建一个在自身内部使用模板但不在其参数中使用模板的函数?我有很多类具有相同的构造函数和函数,但在它们的构造函数中做不同的事情,所以我试图创建一个可以接受数字的函数(这是必要的)来告诉开关模板化值应该成为哪个函数.我该怎么做?

将模板放入函数中而不是模板化函数本身也不起作用

this 不起作用

#include <iostream>

template <typename T> void function(uint8_t s, std::string str1, std::string str2, std::string str3){
        T var;
        switch (s){
            case 1:
                // var = class1();
                break;
            // case 2 ...
            // case 3 ...
            default:
                break;
        }
}

int main() {
        std::string str = "01234567";
        std::cout << function(1, str, str, str) << std::endl;

        return 0;
}

【问题讨论】:

  • 我不确定您到底想做什么,但here 是对您代码的修复。您可能需要解释更多以获得更好的答案。
  • 在无法推断模板参数时使用function&lt;template-args&gt;(func-params) 指定模板参数 - 请参阅@Jesse 的示例。但目前尚不清楚您希望在//var = class1(); 发生什么。
  • 啊。哎呀。我忘了&lt;T&gt;。不幸的是,这并没有解决我的问题。我事先不知道T。我想我可以更改我的代码来做到这一点,但我更愿意在函数中找出T

标签: c++ function templates c++11 arguments


【解决方案1】:

您是否尝试过明确指定模板参数?

function<uint8_t>(1, str, str, str);

编辑: 不可能完全按照您的意愿做,因为模板是在编译时解析的,但函数的参数是在运行时解析的。因此,在编译过程中,编译器不知道 's' 的值是什么。

出于您的目的,我认为工厂模式是合适的。 See Alexandrescu's factory method pattern.

示例用法:

typedef AbstractT* (*CreatorMethod)(std::string, std::string, std::string);
typedef Factory <AbstractT,uint8_t,CreatorMethod> TFactory;

TFactory tfact;

tfact.Register(1, &someCreatorMethod);
tfact.Register(2, &someOtherCreatorMethod);

std::string str = "01234567";

AbstracT* object = tfact.Create(1 str, str, str);
AbstracT* object = tfact.Create(2 str, str, str);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2021-04-19
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多