C++ SFINAE使其独一无二

C++ SFINAE使其独一无二,c++,c++11,templates,unique-ptr,C++,C++11,Templates,Unique Ptr,有没有办法检查类型T是否可以用可变模板参数包Args…构造?我不在乎解决方案是否有效,我只想在调试模式下使用SFINAE或static\u assert template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>

有没有办法检查类型
T
是否可以用可变模板参数包
Args…
构造?我不在乎解决方案是否有效,我只想在调试模式下使用SFINAE或
static\u assert

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
模板
std::unique_ptr使_唯一(Args&&…Args)
{
返回std::unique_ptr(新的T(std::forward(args)…);
}
对于所有感兴趣的人,这个解决方案对我来说是在C++ 11

中起作用的。
template<typename T, typename... Args>
auto make_unique(Args&&... args) -> decltype(std::unique_ptr<T>(new T(std::forward<Args>(args)...)))
{
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
模板
自动使_唯一(Args&&…Args)->decltype(std::unique_ptr(new T(std::forward(Args)…))
{
返回std::unique_ptr(新的T(std::forward(args)…);
}

< /代码> 如果您需要一个便宜的方式检查<代码> t(ARGS…)>代码>是否是一种有效的表达式,请考虑使用表达式sFANE通过尾随返回类型:

模板
自动foo(Args&&…Args)
->decltype(T(std::forward(args)…),void())
{
}

<>代码> Foo如果<代码> t(STD:Ord:(ARGs)…)/代码>不是一个有效的表达式,则将“SimaEUDE”。

< P>如果您需要一个便宜的方法来检查<代码> T(ARGS…)>代码>是否是一个有效的表达式,请考虑使用表达式sFANE通过尾随返回类型:

模板
自动foo(Args&&…Args)
->decltype(T(std::forward(args)…),void())
{
}

如果
T(std::forward(args)…
不是有效的表达式,
foo
将被“SFINAEd out”。

尾部返回类型
auto make_unique(Args&&…Args)->decltype(std::unique_ptr(new T(std::forward(Args)))
?如果不能用传递的参数构造
T
,则
new T(…)
应失败并给出编译器错误。你能详细说明你提出这个问题的原因吗?也许你应该问一下,你想做什么?通常,我看到人们想要这样的模板,因为他们希望它能完全转换成一个更通用的模板(例如,如果是随机访问迭代器,就这样做,如果是双向的,就这样做,否则失败)。如果只有一个模板,它将在新的
上失败吗?它将失败。我只希望它是sfinae,并告诉我在键入参数时没有提供正确的参数。这只是一件方便的事情。尾部返回类型
auto make_unique(Args&&…Args)->decltype(std::unique_ptr(new T(std::forward(Args)))
?如果不能用传递的参数构造
T
,则
new T(…)
应失败并给出编译器错误。你能详细说明你提出这个问题的原因吗?也许你应该问一下,你想做什么?通常,我看到人们想要这样的模板,因为他们希望它能完全转换成一个更通用的模板(例如,如果是随机访问迭代器,就这样做,如果是双向的,就这样做,否则失败)。如果只有一个模板,它将在新的
上失败吗?它将失败。我只希望它是sfinae,并告诉我在键入参数时没有提供正确的参数。这只是一个方便的事情。有没有办法在C++ 11(没有自动返回)@ ANDRANLANJOWE这是C++ 11:)模板Auto MaxIOLL(ARGs & & ARGS)-> DECKECTORD(STD:UnQuyJPTR(新的T(STD::Ord:AgS)…)),{{Sd::UnQuyJPTR(新的T(STD::Ord:AgS)…)}在C++ 11GATEAL AutoMaMax上为我返回无效(Args&&…Args)->decltype(T(std::forward(Args)…),void(){return std::unique_ptr(new T(std::forward(Args)…);}也可以推断为void@AndreasLoanjoe当然,因为<代码>,VoID()/Cux>:有没有办法在C++ 11中(没有自动返回)@ and ReaSoLaChanJe这是C++ 11:模板自动生成唯一(ARGs &…ARGS)> DECKET(STD:UnQuyjpTR(新的T(STD:Ord:ARGs)…)){返回STD::UNQuYGYPTR(新的T(STD::前进(ARGS)…));}返回C++上的C++Type(AGGS和…ARGS)-> DeCype(t(STD:……(OGS)…),VoID()){返回STD::UNIQUYPPTR(新的T(STD::Org)…));也推断为void@AndreasLoanjoe:当然可以,因为那里有void()
template <typename T, typename... Args>
auto foo(Args&&... args) 
    -> decltype(T(std::forward<Args>(args)...), void())
{

}