gpt4 book ai didi

c++ - 在同一实现下模板化 T 和 T&

转载 作者:行者123 更新时间:2023-11-28 07:30:39 24 4
gpt4 key购买 nike

我想用 2 个接口(interface)实现相同的功能,因为两者的实现相同,并且在 2 个重载签名中实现相同的功能,这真的不是我想要的。

#include <iostream>
#include <vector>

template <typename T>
void foo(T&) {} // I have to write the same things here ...

template <typename T>
void foo(T) {} // ... and here

int main() {
foo(std::vector<int>()); // call only for T

std::vector<int> v;
foo(v); // ambiguos call but I only need 1 implementation

return (0);
}

基本上我想解决这种情况并将 2 个模板化函数融合为 1 个。

我不知道,因为主要问题是保持相同的实现,而不仅仅是重载签名或删除模板的使用。

最佳答案

你为什么不使用 rvalues

正如 interjay 所说:它是一个_通用引用_,可以是_右值引用_或_左值引用_

#include <iostream>
#include <vector>

template <typename T>
void foo(T&&) {}
// ^^

int main() {
foo(std::vector<int>());

std::vector<int> v;
foo(v);

return (0);
}

rvalues 将允许引用临时对象和普通对象。

An rvalue (so-called, historically, because rvalues could appear on the right-hand side of an assignment expression) is an object, usually near the end of its lifetime, a temporary object or subobject thereof, or a value that is not associated with an object.

编辑:

您也可以使用 const T& 但它不允许您修改对象:

template <typename T>
void foo( T&& v )
{
v.push_back( 1 ); // good...
}

template <typename T>
void foo2( const T& v )
{
v.push_back( 1 ); // ILLEGAL...
}

如果您根本不需要修改对象,我建议您使用最后一种解决方案。

关于c++ - 在同一实现下模板化 T 和 T&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17805768/

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