rvalue参数无法解析功能超载
rvalue argument cannot resolve in function overload
如何在main()
编译中制作最后一行?
#include <initializer_list>
#include <type_traits>
#include <functional>
template <typename T>
struct foo {
foo(std::initializer_list<T>) { }
template <typename C> struct is_foo : std::false_type { };
template <typename U> struct is_foo<foo<U>> : std::true_type { };
template <typename Compare>
std::enable_if_t<!is_foo<Compare>::value> bar(foo&, Compare comp) {
bool b = comp(T(), T()); // This line compiles thanks to is_foo<Compare>.
}
void bar(foo&& f) { bar(std::forward<foo>(f), std::less<T>()); }
template <typename... Foos>
void bar(Foos&&...) { }
};
int main() {
foo<int> f = {1,2,3};
f.bar({4,5,6}); // Compiles fine
f.bar(f,f); // Compiles fine (thanks to is_foo<Compare>)
f.bar(f,{4,5,6}); // Won't compile
}
应该调用foo<T>::bar(Foos&&...)
。
Test.cpp:27:17: error: no matching function for call to 'foo<int>::bar(foo<int>&, <brace-enclosed initializer list>)'
f.bar(f,{4,5,6}); // Won't compile
^
Test.cpp:13:44: note: candidate: template<class Compare> std::enable_if_t<(! foo<T>::is_foo<C>::value)> foo<T>::bar(foo<T>&, Compare) [with Compare = Compare; T = int]
std::enable_if_t<!is_foo<Compare>::value> bar(foo&, Compare comp) {
^~~
Test.cpp:13:44: note: template argument deduction/substitution failed:
Test.cpp:27:17: note: couldn't deduce template parameter 'Compare'
f.bar(f,{4,5,6});
不确定要确切想要什么,但是,如果您的打算获得了一个variadic bar()
函数,该函数接收零或更多 foo<T>
参数(或可用于初始化 foo<T>
的参数),,好吧...如果您接受参数数量的限制(例如63,在下面的示例中),则有一个技巧。显示一次我想可以适应您的情况。
如果定义了typer
模板别名
template <typename T, std::size_t>
using typer = T;
和递归struct proBar
template <typename T, std::size_t N = 64U,
typename = std::make_index_sequence<N>>
struct proBar;
template <typename T, std::size_t N, std::size_t... Is>
struct proBar<T, N, std::index_sequence<Is...>> : public proBar<T, N-1U>
{
using proBar<T, N-1U>::bar;
void bar (typer<T, Is>... ts)
{ }
};
template <typename T>
struct proBar<T, 0U, std::index_sequence<>>
{
void bar ()
{ }
};
允许定义您需要的bar()
功能,模板struct foo
成为
template <typename T>
struct foo : public proBar<foo<T>>
{
using proBar<foo<T>>::bar;
foo (std::initializer_list<T>)
{ }
template <typename Compare>
auto bar (foo &, Compare comp) -> decltype(comp(T(), T()), void())
{ bool b = comp(T(), T()); }
};
以下是完整的编译示例
#include <initializer_list>
template <typename T, std::size_t>
using typer = T;
template <typename T, std::size_t N = 64U,
typename = std::make_index_sequence<N>>
struct proBar;
template <typename T, std::size_t N, std::size_t... Is>
struct proBar<T, N, std::index_sequence<Is...>> : public proBar<T, N-1U>
{
using proBar<T, N-1U>::bar;
void bar (typer<T, Is>... ts)
{ }
};
template <typename T>
struct proBar<T, 0U, std::index_sequence<>>
{
void bar ()
{ }
};
template <typename T>
struct foo : public proBar<foo<T>>
{
using proBar<foo<T>>::bar;
foo (std::initializer_list<T>)
{ }
template <typename Compare>
auto bar (foo &, Compare comp) -> decltype(comp(T(), T()), void())
{ bool b = comp(T(), T()); }
};
int main()
{
foo<int> f = {1, 2, 3};
f.bar({4, 5, 6});
f.bar(f, f);
f.bar(f, {4, 5, 6}); // now compile
}
这有效。
#include <initializer_list>
#include <type_traits>
#include <functional>
template <typename T>
struct foo {
foo(std::initializer_list<T>) { }
template <typename C> struct is_foo : std::false_type { };
template <typename U> struct is_foo<foo<U>> : std::true_type { };
template <typename Compare>
std::enable_if_t<!is_foo<Compare>::value> bar(foo&, Compare comp) {
bool b = comp(T(), T()); // This line compiles thanks to is_foo<Compare>.
}
void bar(foo&& f) { bar(std::forward<foo>(f), std::less<T>()); }
template <typename... Foos>
void bar(Foos&&...) { }
};
int main() {
foo<int> f = { 1,2,3 };
f.bar({ 4,5,6 }); // Compiles fine
f.bar(f, f); // Compiles fine (thanks to is_foo<Compare>)
f.bar(f, foo<int>({ 4,5,6 })); // Won't compile
}
相关文章:
- 如果我具有调用其其他实例之一的超载函数,它是否被认为是递归功能
- 超载类成员功能标记为const
- 超载分辨率在模板实例化点后找到功能
- 构造函数超载以接受任何功能
- 界面设计:超载功能的安全性采用字符串和字符阵列
- Python C API-返回功能超载中的不同类型
- 模棱两可的功能超载[例如最大限度()]
- BOOST-ASIO ASYNC_RECEIVE_FROM功能超载问题( 动态指针)
- rvalue参数无法解析功能超载
- 指针到抽象类的功能超载
- 如果功能超载,则BOOST PHOENIX成员功能操作员无法编译
- 功能超载以接受所有类型的功能
- 功能超载以NULLPTR作为参数分辨率
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- 功能超载rvalue
- 使用枚举的功能超载
- JNI本地功能超载签名
- 功能超载类设计
- 运行时的功能超载如何工作,以及为什么过载
- 功能超载不起作用