2017-02-22 120 views
0

希望你们能帮助您: 我有以下功能应该与特定类型的返回一个对象的Foo,在这种情况下:在我的富推导出非本模板参数

Foo<int,bool> make_my_foo_object() { 
    return make_foo(10); 
} 

I类有:

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_foo <int, bool>(10);中的函数。

你们认为这有可能的解决方法吗?或者这是一个不行!

任何帮助或信息将不胜感激。 谢谢。

+2

首先,你为什么要避免它传递这些参数?你有他们在上面的行。我问这是因为我可以提出解决方案,但如果我不明白你真正的问题,解决方案可能无法帮助你*。那会浪费我的时间(产生一个不能帮助你的解决方案)。你能否描述一个你正试图解决这个请求的实际问题? – Yakk

+1

你为什么不写'return {10};'。额外的'make_foo'调用如何有用 –

+0

在这个例子中,模板参数很小。真正的例子可能会更棘手,而不仅仅是'make_foo ()'。由于模板参数不能从它们的构造函数中推导出来,所以我需要这个解决方法,因为它是一个众所周知的成语,可以解决这个问题。这个问题对我来说很明显,但问题是如何去(如果可能的话)过去。 如果您需要创建一个包含10种不同类型的元组,您将避免输入所有类型。 谢谢。 – Olivier

回答

0

如果你唯一担心的是避免硬编码类型则params的重复,你可以给他们的名字,像这样:

template <typename A=int, typename B=bool> 
Foo<A,B> make_my_foo_object() { 
    return make_foo<A,B>(10); 
} 

也就是说,要使用什么类型的A和B简单地从移动的决定返回类型返回到模板参数列表。

+0

目前它没有使用bool参数,而B也没有参与任何转换。你什么意思? – Useless

+0

刚刚删除了我以前的评论,现在看它更好,但它有道理,但我试图避免两件事情,如果您必须编写自己的'make_my_foo_object'函数,那么您必须处理模板声明你的功能,这不是我想要做的。我试图避免你在你的函数中写模板签名。谢谢 – Olivier

+0

_in your function_ - in ** what ** function?在来电者?这并不需要详细说明这些参数,这就是违约的全部原因。在'make_my_foo_object'中呢?你必须在某个地方指定类型,你之前只有它们在返回类型中。或者你只是想避免输入'template'关键字出于某种原因? – Useless

1
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)...)}; 
} 

live example

make_something(args...)不做任何事情。相反,您可以使用它来构建(几乎)任何东西,并且它使用args...来构建您从中构建的任何类型。

这可能不是一个好主意,但它会根据您构建的对象来推断出您制作的对象的类型。

1

我想避免的是在返回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,所以返回类型是允许的,剩下的就是这样。
按要求(如果我的请求正确)不再有模板参数,也就是说它不是函数模板。