我的函数使用一组给定的输入参数(变量)调用Python函数,并返回包含函数输出的元组(变量,因为输出随调用的函数而变化)。
我正在使用C 11通过MinGW-w64编译器的g端口在视窗10机器上编译。我声明了这个模板变量函数(并调用它)如下:
// Declaration (in PyInterface.h)
template <typename... Inputs, typename... Outputs>
const std::tuple<Outputs...>& callFunction(const std::string &modulePath, const std::string &funcName, Inputs&&... args) {
// Calls a Python function & packs output variables into a std::tuple...
}
// Sample call (in main.cpp)
const std::tuple<std::string, std::string> output = pi.callFunction(myModulePath, myFuncName, inputArg1, inputArg2, inputArg3);
但是,会引发此错误(为了可读性,缩短为…
):
从“const std::tuple”转换
据我所知,使用两个可变模板是合法的。此外,在我看来,返回类型是由变量(
const std::tuple)显式设置的
最初,我认为这个错误只是表明我没有适当地使用变量模板。我尝试使用嵌套模板参数(如图所示)来指定返回类型(即,
const T
这个错误表明我的直觉是错误的,并且在我的原始函数中,编译器没有从
输出的
类型推断出所需的返回类型。
为什么我的直觉错了?如何正确使用变量模板来指定函数的返回类型?
与C编译器错误消息一样,您只需要查看第一个错误消息。我猜测(因为您没有提供代码)您正在创建一个tuple
值,然后返回对它的const引用。在函数的末尾,元组
被销毁,那么引用应该指什么?你应该只返回元组
我认为您可以通过交换
输入
和输出
类型包来实现您想要的。此代码还说明了使用show
功能在输入
类型包上迭代。您可以做类似的事情来构建元组
#include <iostream>
#include <tuple>
#include <utility>
using namespace std;
template< typename Output > struct convert_t;
template<> struct convert_t< string >
{
string operator()( const char *text ) const
{
return text;
}
string operator()( double val ) const
{
return to_string( val );
}
};
inline void show()
{}
template< typename First, typename... Others >
inline void show( First &&first, Others&&... others )
{
cout << first << "\n";
show( forward< Others >( others )... );
}
template< typename... Outputs, typename... Inputs >
inline tuple< Outputs... > funkyfunc( Inputs&&... inputs )
{
cout << "Inputs...\n";
show( forward< Inputs >( inputs )... );
return tuple< Outputs... >( convert_t< Outputs >()( inputs )... );
}
int main()
{
auto t = funkyfunc< string, string >( "text", 123.0 );
cout << "Outputs...\n";
cout << get<0>( t ) << "\n";
cout << get<1>( t ) << "\n";
return 0;
}
如果您想根据函数范围内返回的对象的类型推断返回类型,如果您在C 14上,则可以使用auto
作为返回类型。它很有魅力
template <typename... Inputs>
const auto& callFunction(
const std::string &modulePath,
const std::string &funcName,
Inputs&&... args) {
return object;
}
与往常一样,要注意从这个函数返回一个const引用。
如果您使用的是C11,那么您可以使用尾随返回类型,例如
template <typename T>
auto identity_return(T& obj) -> decltype(obj) {
return obj;
}
其中dectype(obj)
是要返回的东西的类型。再次注意,在这种情况下,它再次是一个参考。
通常,尽管try和return值来自函数,但如果您不确定返回的内容是否比返回的时间长,则返回的引用可能会导致挂起引用。
另一个解决方案是只指定输出
类型列表,让编译器推断类型
输入
template <typename... Outputs, typename... Inputs>
const std::tuple<Outputs...>& callFunction(
const std::string &modulePath,
const std::string &funcName,
Inputs&&... args) { ... }
auto tup = callFunction<std::string, std::string>(modulePath, funcName, args);
变量通用属性 变量通用属性有title,value,type,tip,rule,message,除了通用属性个别变量还有其它属性,请看每个具体控件; "vars": { "varName1": { "title": "测试 text", /*后台设置时 input 的 label*/ "value": "1", /*变量默认值*/ "type
变量通用属性 变量通用属性有title,value,type,tip,rule,message,除了通用属性个别变量还有其它属性,请看每个具体控件; "vars": { "varName1": { "title": "测试 text", /*后台设置时 input 的 label*/ "value": "1", /*变量默认值*/ "type
我有类似于这个问题用例 我想检查什么类型的实例变量存储在参数中而不引发异常 我想做的是这样的事情 我如何改变这个实现,使它允许我窥视什么类型的参数是持有的 谢谢你的回答,还有几点 我是C++11所以不能使用variant或any 有没有标准的方法。我想要的是一个实例变量的类,可以是多种类型(有界的),并在阅读它时,检查它是什么类型
我很难弄清楚如何使用适当的模板化参数调用setValue函数。在ParameterBase抽象基类中不可能有模板化的参数。非常感谢任何帮助。 附注。我没有使用boost::any的灵活性。
我有以下代码使用可变参数模板来调用std::async, 但我收到以下编译错误消息: 没有用于调用“async(std::launch,bool (TestChild:: 我认为这可能与我传递其他参数以及参数包的事实有关。任何人都知道这有什么问题,我应该做些什么来让它发挥作用?
本文向大家介绍C#变量类型作为参数和返回值,包括了C#变量类型作为参数和返回值的使用技巧和注意事项,需要的朋友参考一下 示例 如果协变量类型显示为输出,则包含类型为协变量。生产Ts的生产者就像生产Ts。 如果逆变类型显示为输出,则包含类型为逆变。产生Ts的消费者就像消费Ts。 如果协变类型作为输入出现,则包含类型是协变的。消费Ts的生产者就像消费Ts。 如果逆变类型显示为输入,则包含类型为协变。消