C++ 使函数调用依赖于模板参数
C++ Make function call dependent on template parameter
在一个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;
}
};
现场示例
您可以添加虚拟标记以允许 ADL:
template <typename T> struct tag {};
template <typename T>
void serialize(const T &data)
{
size_t data_size = getSize(data, tag<T>{});
std::cout << "Size: " << data_size << std::endl;
}
constexpr size_t getSize(const int &, tag<int>)
{
return sizeof(int);
}
size_t getSize(const std::string &str, tag<std::string>)
{
return str.size();
}
template <typename T, size_t N>
size_t getSize(const std::array<T, N> &array, tag<std::array<T, N>>)
{
size_t array_size = 0;
for (const T &element : array)
array_size += getSize(element, tag<T>{});
return array_size;
}
演示
相关文章:
- 类成员函数参数列表是否可以依赖于模板参数?
- 如何定义依赖于参数包转换的函数的返回类型
- C++ 使函数调用依赖于模板参数
- 如何初始化依赖于先前条目的可变参数模板?
- 如何修复"没有依赖于模板参数的参数'glGenVertexArrays'......"C++ 中的错误
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 依赖于其他模板参数的模板参数
- 使用不依赖于方法模板参数的enable_if
- 如何定义具有依赖于符号调试的参数的函数
- 如何让成员函数实现依赖于类的模板参数?
- 如何避免参数数量依赖于条件的调用分支?
- 为什么在这种情况下不考虑依赖于参数的查找?
- 如何定义依赖于模板参数的类型定义
- 类型依赖于可变参数模板的类
- C++是否可以创建依赖于单个构造函数参数的派生类而不是bass类
- 我如何避免使用依赖于参数的查找明确专门化模板化功能
- 为什么默认参数不能依赖于非默认参数?
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- C++ 错误:"没有依赖于模板参数的'setw'参数
- 依赖于模板参数的范围查找