Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用运算符()时是否可以提供模板参数?_C++_Templates_Operator Overloading - Fatal编程技术网

C++ 调用运算符()时是否可以提供模板参数?

C++ 调用运算符()时是否可以提供模板参数?,c++,templates,operator-overloading,C++,Templates,Operator Overloading,我想使用一个模板操作符(),但不确定是否可行。下面是一个不会编译的简单测试用例。我的语法是否有问题,或者这根本不可能 struct A { template<typename T> void f() { } template<typename T> void operator()() { } }; int main() { A a; a.f<int>(); // This compiles. a.operator()&

我想使用一个模板
操作符()
,但不确定是否可行。下面是一个不会编译的简单测试用例。我的语法是否有问题,或者这根本不可能

struct A {
  template<typename T> void f() { }
  template<typename T> void operator()() { }
};

int main() {
  A a;
  a.f<int>();           // This compiles.
  a.operator()<int>();  // This compiles.
  a<int>();             // This won't compile.
  return 0;
}
结构A{ 模板void f(){} 模板无效运算符()({} }; int main(){ A A; a、 f();//这是编译的。 a、 运算符()();//这将编译。 a();//这将无法编译。 返回0; }
就像chris在评论中提到的那样,不,不是用速记语法。您必须使用完整的
.operator()
语法

> P>你想使用的确切语法在C++语言中是不可能的。 根据您试图解决的实际问题(这不是问题),我至少可以想到三个选项:

  • 使用命名函数而不是运算符
  • 模板
    A
    ,而不是运算符本身
  • 使用详细的拼写调用
    操作符()
    (我不太喜欢这个选项)
如果您真的想使用模板化的
操作符()
并且想避免编写像
a.operator()这样的结构您可以向其添加一个辅助参数:

template <typename T>
struct type{};

struct A
{
    template<typename T>
    void operator()(type<T>) { }
};

int main()
{
    A a;

    a(type<int>());
}
模板
结构类型{};
结构A
{
模板
void运算符()(类型){}
};
int main()
{
A A;
a(type());
}


在C++14中,您甚至可以省略
a(type())中的空括号通过变量模板:

template <typename T>
struct type_{};

template <typename T>
constexpr type_<T> type{};

struct A
{
    template<typename T>
    void operator()(type_<T>) { }
};

int main()
{
    A a;

    a(type<int>);
}
模板
结构类型{};
模板
constexpr type_utype{};
结构A
{
模板
void运算符()(类型{}
};
int main()
{
A A;
a型;
}

.

不使用速记语法,不,[编辑]你能告诉我们操作符如何使用
T
?@MarkB仅举一个例子:
抛出T
返回T
(这里不是这种情况,但也不会推断)。你想做什么?似乎您试图使用错误的工具。@Paul您是说函数的实现取决于
T
还是签名取决于?如果签名依赖于模板,那么模板类型推断可能是可能的(但在某些情况下并非如此)。一个技巧(并非总是可能的)是添加一个仅用于类型推断的伪参数,如
operator()(T dummy)
,然后用
a(int())
调用它。它将被优化,因此不涉及运行时开销,但它需要
T
拥有一个没有副作用的默认构造函数。但我不确定这是否真的比
a.operator()