从返回函数中推断不存在的模板参数

Deduce non present template parameter from return function

本文关键字:参数 不存在 返回 函数      更新时间:2023-10-16

希望你们能帮上忙: 我有以下函数应该返回一个对象 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 使用哪些类型的决定只是从返回类型移动到模板参数列表。