gpt4 book ai didi

c++ - 将 std::make_tuple 与重载函数一起使用时如何避免 static_cast

转载 作者:可可西里 更新时间:2023-11-01 18:29:35 24 4
gpt4 key购买 nike

g++ 说

error: too many arguments to function 'constexpr std::tuple

如果我在 std::make_tuple 调用中省略了 static_cast

#include <tuple>

typedef int (*func_t)();

int number() {
return 2;
}

double number(bool a) {
return 1.2;
}

int main() {
// With a static_cast it compiles without any error
// std::tuple<func_t> tup = std::make_tuple(static_cast<func_t>(number));

std::tuple<func_t> tup = std::make_tuple(number);
return 0;
}

这里是完整的错误信息:

$ g++ -std=c++11 test.cc
test.cc: In function 'int main()':
test.cc:31:54: error: too many arguments to function 'constexpr std::tuple<typename std::__decay_and_strip<_Elements>::__type ...> std::make_tuple(_Elements&& ...) [with _Elements = {}; typename std::__decay_and_strip<_Elements>::__type = <type error>]'
In file included from test.cc:1:0:
/usr/include/c++/4.7/tuple:844:5: note: declared here
test.cc:31:54: error: conversion from 'std::tuple<>' to non-scalar type 'std::tuple<int (*)()>' requested
$ g++ --version
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

如果我把主函数改成

int main() {
std::tuple<func_t> tup = std::make_tuple(static_cast<func_t>(number));
return 0;
}

程序编译得很好。是否有可能以某种方式省略 static_cast ?似乎没有必要提供类型 func_t 两次。

最佳答案

不要使用 std::make_tuple。使用 braced-init-list 作为:

std::tuple<func_t> tup { number };

现在编译器将选择合适的重载匹配func_t

参见 live demo

关于c++ - 将 std::make_tuple 与重载函数一起使用时如何避免 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276179/

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