从返回函数中推断不存在的模板参数
Deduce non present template parameter from return function
希望你们能帮上忙: 我有以下函数应该返回一个对象 Foo,在本例中具有特定类型:
Foo<int,bool> make_my_foo_object() {
return make_foo(10);
}
在我的Foo课上,我有:
template <class A, class B>
struct Foo {
Foo(A aa): a(aa) {}
Foo(B bb): b(bb) {}
A a;
B b;
};
然后,在我的make_foo函数中,我有:
template<typename A, class B>
Foo<A,B> make_foo(A a) {
return Foo<A,B>(a); // this should call the Foo(A) ctor
};
我知道这是不可能的,因为在这个简单的实现中,没有办法从make_foo的返回类型推断出B
。
在这种情况下,make_my_foo_object
没有多大意义,但整个想法是处理模板参数,这些参数在丢失时无法推断。
我试图避免的是指定返回make_foo<int, bool>
(10)中的类型;在make_my_foo_object
函数中。
你们认为有可能的解决方法吗? 否则就不行了!
任何帮助或信息将不胜感激。 谢谢。
template<class...Ts>
struct make_something_t {
std::tuple<Ts...> data;
template<class T, std::size_t...Is>
T make(std::index_sequence<Is...>) && {
return T( std::get<Is>(std::move(data))... );
}
template<class T>
operator T()&&{
return std::move(*this).template make<T>(std::make_index_sequence<sizeof...(Ts)>{});
}
};
template<class...Ts>
make_something_t<Ts...> make_something( Ts&&...ts ) {
return {std::forward_as_tuple(std::forward<Ts>(ts)...)};
}
活生生的例子。
make_something(args...)
什么都做不了。 相反,你可以使用它来构造(几乎)任何东西,它使用args...
来做你从它构建的任何类型的构造。
这可能不是一个好主意,但它通过你从中构建的对象来推断你制作的对象的类型。
我想避免的是指定返回 make_foo(10); 中的类型; 在make_my_foo_object函数中。
这样的东西可能适合您(C++14 中的最小工作示例):
template <class A, class B>
struct Foo {
Foo(A aa): a(aa) {}
Foo(B bb): b(bb) {}
A a;
B b;
};
template<typename A, class B>
Foo<A,B> make_foo(A a) {
return Foo<A,B>(a);
}
struct W {
template<typename A, typename B>
operator Foo<A, B>() {
return make_foo<A, B>(10);
}
};
auto make_my_foo_object() {
return W{};
}
int main() {
Foo<int, bool> foo1 = make_my_foo_object();
Foo<int, char> foo2 = make_my_foo_object();
}
模板参数由W
中的运算符推导:
template<typename A, typename B>
operator Foo<A, B>() {
return make_foo<A, B>(10);
}
对于将其标记为 C++14 的,auto
返回类型是允许的,其余的由它执行。
根据请求(如果我正确收到您的请求),make_my_foo_object
不再具有模板参数,即它不是函数模板。
如果您唯一关心的是避免重复硬编码类型参数,您可以像这样为它们命名:
template <typename A=int, typename B=bool>
Foo<A,B> make_my_foo_object() {
return make_foo<A,B>(10);
}
也就是说,关于对 A 和 B 使用哪些类型的决定只是从返回类型移动到模板参数列表。
相关文章:
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- g++ 说函数不存在,即使包含正确的标头
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 模板参数推导失败,函数参数/参数不匹配
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 查找第一个数组中不存在的元素
- 查找不存在的键时,unordered_map返回什么
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- 类中的虚拟布尔函数参数不起作用
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- set::find 查找不存在的元素
- 有没有办法将字符串添加到 Vector 中,但前提是它尚不存在?->C++
- inet_ntop返回不存在的地址
- CPP 使用不存在的键访问映射
- 从返回函数中推断不存在的模板参数
- 不存在的标识符在非启用函数模板中用作默认参数
- 为什么 void 参数不能存在于具有多个参数的函数中?