gpt4 book ai didi

c++ - 用于格式化的字符串参数与模板参数

转载 作者:行者123 更新时间:2023-11-30 05:48:32 24 4
gpt4 key购买 nike

我想知道这两种提供格式字符串的方法中的一种是否可以被认为“更正确”。显然两者都有效,但一个需要在命名空间中维护一系列常量字符串,而另一个使用类:

#include <ctime>
#include <iostream>

// Method 1: constant strings:
char const* STANDARD = "%c";
char const* ISO8601 = "%Y-%m-%dT%H:%M:%S%z";

const std::string timestamp(char const* format) {
time_t raw_time;
time(&raw_time);
struct tm* time_info = localtime(&raw_time);
const size_t maxsize = 80;
char time_str[maxsize];
strftime(time_str, maxsize, format, time_info);
return time_str;
}

// Method 2: Class-based formatter used as a template parameter:
struct standard {
static inline char const* format() { return "%c"; }
};

struct iso8601 {
static inline char const* format() { return "%Y-%m-%dT%H:%M:%S%z"; }
};

// The formatter is supplied as a template parameter.
template<typename T>
const std::string timestamp() {
time_t raw_time;
time(&raw_time);
struct tm* time_info = localtime(&raw_time);
const size_t maxsize = 80;
char time_str[maxsize];
strftime(time_str, maxsize, T::format(), time_info);
return time_str;
}

int main() {
// Method 1: constant strings:
std::cout << timestamp(ISO8601) << std::endl;

// Method 2: template:
std::cout << timestamp<iso8601>() << std::endl;
}

想法?建议?我不太熟悉模板编程(特征、策略等),所以我真的很好奇其中一个比另一个“更好”或“更正确”。

最佳答案

如果您正在命名不同的格式,并且您想要一个常量名称所有的调用站点,那么显而易见的解决方案是这样的:

extern char standard[] = "%c";
extern char iso8601[] = "%Y-%m-%dT%H:%M:%S%z";

// ...

template <char const* format>
std::string timestamp()
{
// ...
}

如果没有太多的命名格式,你甚至可以使用显式特化:

template <char const* format> std::string timestamp();
template<> std::string timestamp<standard>()
{
// ...
}
template <> std::string timestamp<iso8601>()
{
// ...
}

但是,如果您正在动态评估格式,我看不到在哪里这些比 std::string timestamp( char const* format ) 更能给你带来好处。使用模板的唯一优势是解决方案显式实例化确保你只会得到一个已知格式;代码将无法编译和链接,如果你没有明确的实例化。这反过来意味着你不需要任何额外的检查你的缓冲区是否足够大(你无论如何都要省略——在你的两个实现中,有可能用户给出一个会导致缓冲区溢出的人工字符串)。

关于c++ - 用于格式化的字符串参数与模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28136245/

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