Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当所有类型都没有共同的代码时使用模板_C++ - Fatal编程技术网

C++ 当所有类型都没有共同的代码时使用模板

C++ 当所有类型都没有共同的代码时使用模板,c++,C++,我有以下课程: class ValueSetter: public IValueSetter { public: explicit ValueSetter(CContainer* container) : _container(container) { } virtual void operator()(const int value, const int index) const { _container->val

我有以下课程:

class ValueSetter: public IValueSetter
{
public:
    explicit ValueSetter(CContainer* container)
        : _container(container)
    {
    }

    virtual void operator()(const int value, const int index) const
    {
        _container->values[index].value.i = value;
    }

    virtual void operator()(const double value, const int index) const
    {
        _container->values[index].value.d = value;
    }

    virtual void operator()(const std::string& value, const int index) const
    {
        ...
        _container->values[index].value.s = _strdup(value.c_str());
    }

private:
    CContainer* _container;
};
此类在CContainer上操作,CContainer将其数据存储在联合的缓冲区中。我将ValueSetter传递给一个容器类,该类不了解CContainer。事实上,在未来,我希望CContainer(通过C API接收)将消失,而这些值将被组织在std::vector或std::list中。我的容器的接口不应该因此而改变,也不应该关心数据如何存储在内存中

考虑到这一点,我更倾向于大致如下:

class IntValueSetter: public IIntValueSetter
{
public:
    explicit IntValueSetter(Container* container)
        : _container(container)
    {
    }

    virtual void operator()(const int value, const int index) const
    {
        _container->values[index].value.i = value;
    }
private:
    CContainer_3* _container;
}
或:


我该怎么做

如果我没弄错,您只需要编写一个类模板:

template <typename T>
class ValueSetter
{
public:
    explicit ValueSetter(std::vector<T> values): _values(values)
    {
    }
    virtual void operator()(const T value, const int index) const
    {
        _container->values[index].value.i = value;
    }
// etc.
};
模板
类值设置器
{
公众:
显式ValueSetter(标准::向量值):\u值(值)
{
}
虚空运算符()(常量T值,常量int索引)常量
{
_容器->值[索引].value.i=值;
}
//等等。
};

如果我没记错,您只需要编写一个类模板:

template <typename T>
class ValueSetter
{
public:
    explicit ValueSetter(std::vector<T> values): _values(values)
    {
    }
    virtual void operator()(const T value, const int index) const
    {
        _container->values[index].value.i = value;
    }
// etc.
};
模板
类值设置器
{
公众:
显式ValueSetter(标准::向量值):\u值(值)
{
}
虚空运算符()(常量T值,常量int索引)常量
{
_容器->值[索引].value.i=值;
}
//等等。
};

我想我在找这样的东西。下面我只实现了int,但每种类型都有自己的接口类和实现类。我很想听听你对这种方法的评论

template<typename V>
class IValueSetter
{
public:
};

template<>
class IValueSetter<std::string> 
{
public:
    virtual void operator()(const std::string& value, int index) const = 0;
};

template<typename V>
class ValueSetter
{
};

template<>
class ValueSetter<std::string>: public IValueSetter<std::string>
{
public:
    explicit ValueSetter2(CContainer* container)
        : _container(container)
    {
    }

    void operator()(const std::string& value, int index) const
    {
        _container->values[index].value.s = _strdup(value.c_str());
    }

private:
    CContainer* _container;
};

template<>
class NewValueSetter<std::string>: public IValueSetter<std::string>
{
public:
    explicit NewValueSetter(std::shared_ptr<std::list<std::string>> values)
        : _values(values)
    {
    }

    void operator()(const std::string& value, int index) const
    {
        (*values)[index] = value;
    }

private:
    std::shared_ptr<std::list<std::string>> _values;
};
模板
类设置器
{
公众:
};
模板
类设置器
{
公众:
虚拟void操作符()(const std::string&value,int index)const=0;
};
模板
类值设置器
{
};
模板
类值设置器:公共值设置器
{
公众:
显式ValueSetter2(CContainer*容器)
:_集装箱(集装箱)
{
}
void运算符()(const std::string&value,int index)const
{
_容器->值[index].value.s=_strdup(value.c_str());
}
私人:
c集装箱*_集装箱;
};
模板
类NewValueSetter:公共IValueSetter
{
公众:
显式NewValueSetter(标准::共享值)
:_值(值)
{
}
void运算符()(const std::string&value,int index)const
{
(*数值)[指数]=数值;
}
私人:
std::共享的ptr值;
};

我想我在找这样的东西。下面我只实现了int,但每种类型都有自己的接口类和实现类。我很想听听你对这种方法的评论

template<typename V>
class IValueSetter
{
public:
};

template<>
class IValueSetter<std::string> 
{
public:
    virtual void operator()(const std::string& value, int index) const = 0;
};

template<typename V>
class ValueSetter
{
};

template<>
class ValueSetter<std::string>: public IValueSetter<std::string>
{
public:
    explicit ValueSetter2(CContainer* container)
        : _container(container)
    {
    }

    void operator()(const std::string& value, int index) const
    {
        _container->values[index].value.s = _strdup(value.c_str());
    }

private:
    CContainer* _container;
};

template<>
class NewValueSetter<std::string>: public IValueSetter<std::string>
{
public:
    explicit NewValueSetter(std::shared_ptr<std::list<std::string>> values)
        : _values(values)
    {
    }

    void operator()(const std::string& value, int index) const
    {
        (*values)[index] = value;
    }

private:
    std::shared_ptr<std::list<std::string>> _values;
};
模板
类设置器
{
公众:
};
模板
类设置器
{
公众:
虚拟void操作符()(const std::string&value,int index)const=0;
};
模板
类值设置器
{
};
模板
类值设置器:公共值设置器
{
公众:
显式ValueSetter2(CContainer*容器)
:_集装箱(集装箱)
{
}
void运算符()(const std::string&value,int index)const
{
_容器->值[index].value.s=_strdup(value.c_str());
}
私人:
c集装箱*_集装箱;
};
模板
类NewValueSetter:公共IValueSetter
{
公众:
显式NewValueSetter(标准::共享值)
:_值(值)
{
}
void运算符()(const std::string&value,int index)const
{
(*数值)[指数]=数值;
}
私人:
std::共享的ptr值;
};

做显而易见的事就行了。不要求模板专门化与另一个专门化或原始模板有任何共同之处。因此:

class IIntValueSetter {
};

template <class Ty> class ValueSetter; // declared but not defined

template <>
class ValueSetter<int> : public IIntValueSetter {
    // whatever
};

ValueSetter<int> vsi;
类IIntValueSetter{
};
模板类ValueSetter;//已声明但未定义
模板
类ValueSetter:公共IIntValueSetter{
//随便
};
价值设定者;

做显而易见的事就行了。不要求模板专门化与另一个专门化或原始模板有任何共同之处。因此:

class IIntValueSetter {
};

template <class Ty> class ValueSetter; // declared but not defined

template <>
class ValueSetter<int> : public IIntValueSetter {
    // whatever
};

ValueSetter<int> vsi;
类IIntValueSetter{
};
模板类ValueSetter;//已声明但未定义
模板
类ValueSetter:公共IIntValueSetter{
//随便
};
价值设定者;

No这不起作用,因为例如,double存储在d union成员而不是i(int)成员中。@Baz-但这表明容器的接口不够丰富;如果可以对它进行增强,为它可以处理的各种类型提供重载setter,那么上面的代码就可以调用setter,重载解析将选择合适的setter。@Pete Becker抱歉,我不明白。你能详细说明一下吗?谢谢@Baz-
\u容器->值[索引].设置(值)
其中
set
对于
int
float
以及容器可以容纳的任何其他类型都重载。各种
set
函数将值放入相应的联合成员中。@Pete Becker\u容器->值[index]的类型是在C API中定义的结构类型。我不能向它添加成员,因为我不拥有它。CContainers可能包含大量数据,我无法用另一种结构复制它们。不,这不起作用,因为例如,double存储在d union成员中,而不是I(int)成员中。@Baz-但这表明容器的接口不够丰富;如果可以对它进行增强,为它可以处理的各种类型提供重载setter,那么上面的代码就可以调用setter,重载解析将选择合适的setter。@Pete Becker抱歉,我不明白。你能详细说明一下吗?谢谢@Baz-
\u容器->值[索引].设置(值)
其中
set
对于
int
float
以及容器可以容纳的任何其他类型都重载。各种
set
函数将值放入相应的联合成员中。@Pete Becker\u容器->值[index]的类型是在C API中定义的结构类型。我不能添加成员,因为我不拥有它