gpt4 book ai didi

c++ - 当需要特定于类型参数的代码时,应使用模板吗?

转载 作者:行者123 更新时间:2023-12-02 10:22:37 25 4
gpt4 key购买 nike

想象一下,我们有一个类负责为SQL准备好的语句设置值,如下所示:

void MySqlPreparedStatement::SetString(uint32_t paramIndex, const std::string& value);
void MySqlPreparedStatement::SetBinary(uint32_t paramIndex, const void* value, size_t length);
void MySqlPreparedStatement::SetUInt64(uint32_t paramIndex, const uint64_t value);
void MySqlPreparedStatement::SetInt64(uint32_t paramIndex, const int64_t value);
// ...

所有这些“设置”方法的代码在它们之间是通用的,但仍然有一些代码取决于用户在其中设置的值的类型(例如,对于64位整数,为 m_parameters[paramIndex].buffer_type = MYSQL_TYPE_LONGLONG;;对于32位整数,为 m_parameters[paramIndex].buffer_type = MYSQL_TYPE_LONG;)。

在这种情况下,哪种方法更好?将所有这些“set”方法封装在一个模板方法中(这将使我在每个接受的类型参数上创建一些switch / case以获取 buffer_type的正确值),或者仅为每种接受的值类型声明不同的方法,例如我上面显示的声明?

最佳答案

最合适的方法在很大程度上取决于函数中包含的代码。

如果您可以清楚地将特定代码和常见的相同代码分开,则将这些相同的代码封装在一个单独的函数中,然后从包含特定部分的较小函数中调用一个可能更合适(稍微缩短签名):

void setUInt64(uint64_t value)
{
// some code specific to uint64_t, maybe converting to binary or textual representation
setParameter(/*...*/, sizeof(value), MYSQL_TYPE_LONGLONG);
}

(根据您的评论,在您的具体示例中似乎就是这种情况。)

但是,如果您将通用代码和特定代码混合在一起(扩展了观点),则情况会发生变化:
void setInt32(int32_t value)
{
firstCommonFunction(/*...*/);
// some specific code
secondCommonFunction(/*...*/);
}

您真的要为每个功能实现该模式吗?虽然上面可能是一个极端的情况,但如果函数变得更加复杂,则最好使用模板:
template <typename T>
void setParameter(T const& value)
{
firstCommonFunction(/*...*/);
firstSpecificFunction<T>(/*...*/);
secondCommonFunction(/*...*/);
secondSpecificFunction<T>(/*...*/);
thirdCommonFunction(/*...*/);
thirdSpecificFunction<T>(/*...*/);
fourthCommonFunction(/*...*/);
}

现在,一个模板可确保您的所有功能行为相同,并在适当时调用通用和特定功能。

如果您的功能无论如何都是设计使然,那就很好。但是,仅仅为了能够拥有模板而人工地强制执行这种设计通常不是一个好主意...

关于c++ - 当需要特定于类型参数的代码时,应使用模板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59466253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com