gpt4 book ai didi

C++使函数调用依赖于模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:52 24 4
gpt4 key购买 nike

在 C++ 模板函数中,我想调用另一个尚未声明的重载函数。由于函数不依赖,编译器将无法解析它。

代码如下所示:

#include <array>
#include <iostream>
#include <string>

template <typename T>
void serialize(const T &data)
{
size_t data_size = getSize(data);
std::cout << "Size: " << data_size << std::endl;
}

constexpr size_t getSize(const int &)
{
return sizeof(int);
}

size_t getSize(const std::string &str)
{
return str.size();
}

template <typename T, size_t N>
size_t getSize(const std::array<T, N> &array)
{
size_t array_size = 0;
for (const T &element : array)
array_size += getSize(element);
return array_size;
}

int main()
{
int a;
serialize(a);

std::string str = "foo";
serialize(str);

std::array<std::string, 2> arr = {{"foo", "foobar"}};
serialize(arr);

return 0;
}

是否有一种使 getSize() 依赖的好方法?或者还有其他方法可以实现这一目标吗?

最佳答案

您可以使 getSize() 成为辅助结构的成员:

template <typename T>
struct size_getter {
static size_t getSize( T );
};

template <typename T>
void serialize(const T &data)
{
size_t data_size = size_getter<T>::getSize( data );
std::cout << "Size: " << data_size << std::endl;
}

然后专门化它们:

template<>
struct size_getter<std::string> {
static size_t getSize( const std::string &s )
{
return s.size();
}
};

template <typename T, size_t N>
struct size_getter<std::array<T, N>>
{
static size_t getSize(const std::array<T, N> &array)
{
size_t array_size = 0;
for (const T &element : array)
array_size += size_getter<T>::getSize(element);
return array_size;
}
};

Live example

关于C++使函数调用依赖于模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51049448/

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