- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请考虑以下示例(标签分发、可变参数模板、完美转发等,全部合而为一):
#include <iostream>
#include <utility>
#include <string>
struct A { };
struct B { };
void doIt(A&&, const std::string &) {
std::cout << "A-spec" << std::endl;
}
template<typename T, typename... Args>
void doIt(T&&, Args&&...) {
std::cout << "template" << std::endl;
}
template<typename T, typename... Args>
void fn(Args&&... args) {
doIt(T{}, std::forward<Args>(args)...);
}
int main() {
const std::string foo = "foo";
std::string bar = "bar";
fn<A>(foo);
fn<A>(bar);
fn<B>(foo);
}
在这种情况下,输出是:
A-spec
template
template
原因很明显,我不介意。
我想要实现的是在这两种情况下调用 doIt
函数的第一个实例,无论字符串是否具有 const 说明符。
当然,一个可能的解决方案是用正确的原型(prototype)定义一个新的doIt
,无论如何我想知道是否还有另一种解决方案。
到目前为止,我已经尝试通过 add_const
获取它,但我很确定我错过了一些东西。
是否有任何可行的解决方案来静默添加 const 说明符并使其正常工作?
编辑
我已经更新了上面的示例,以便与实际问题更加一致。
此外,尽管答案很有趣,但我忘了指出这只是一个简化的例子,所以真正的问题不仅仅涉及 std::string
。相反,可能发生(例如)对于标签 A
,参数是 int
和 const std::string &
,而对于标签B
参数是float
,类C
的实例,等等。
因此,那些试图以某种方式使用 std::string
类型解决问题的答案将无法解决真正的问题,我很抱歉。
最佳答案
引入两个独立的函数,这样它们就不会相互冲突,编译器也不会引发任何歧义错误:
void doIt(A&&, const std::string &)
{
std::cout << "A-spec" << std::endl;
}
template <typename T, typename... Args>
void doIt_template(T&&, Args&&...)
{
std::cout << "template" << std::endl;
}
优先考虑两个额外的重载;首选的是尝试调用目标函数的专用非模板版本:
template <typename T, typename... Args>
auto fn_impl(int, Args&&... args)
-> decltype(doIt(T{}, std::forward<Args>(args)...), void())
{
doIt(T{}, std::forward<Args>(args)...);
}
template <typename T, typename... Args>
void fn_impl(char, Args&&... args)
{
doIt_template(T{}, std::forward<Args>(args)...);
}
引入一个单一的通用调度程序:
template <typename T, typename... Args>
void fn(Args&&... args)
{
fn_impl<T>(0, std::forward<Args>(args)...);
}
关于c++ - 标签调度、可变参数模板、通用引用和遗漏的 const 说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34742701/
我正在尝试运行某人给我的一些 C++ 代码。起初有一个指向 istream 文件的断开链接,我通过添加包含路径修复了这个问题: C:\Program Files (x86)\Embarcadero\R
谁能告诉我如何防止 .git 目录的内容被上传到 PyPi。我的 MANIFEST.in 看起来像这样: global-include *.py *.js *.rst *.html *.css *.l
最近在 typescript 项目的VSCode中遇到如下情况: 文件:some-interface.ts // no import statements have been skipped. Thi
为我找到这个问题的合适标题有点困难,所以也许这个例子会澄清我的问题。 我正在发出 ajax 请求以将一些变量从 JS 传递到 PHP。这些变量之一是带有一些选项的 URL,即 https://www.
我是一名优秀的程序员,十分优秀!