启用和访问模板方法

时间:2018-04-04 09:24:15

标签: c++ function templates

在以下代码中:

#include<iostream>
#include<cstdlib>
#include<type_traits>
using std::enable_if;
using std::is_same;
using std::cout;
using std::endl;

template<typename T>
struct S{
        S(){t = static_cast<T>(NULL);}
        template<typename U,typename enable_if<is_same<T,U>::value>::type>void operator()(U&& rrU){t = rrU;}

        T t;
};

int main(){

        S<int> s;
        return(0);
}

operator()中实例化模板结构后,如何实例化并使用模板结构中定义的main()模板方法?

1 个答案:

答案 0 :(得分:0)

我必须承认,我不太确定你想要达到的目标,但类型将在编译过程中推断,因此你不会# 39;不必担心。无论如何,我会按如下方式实现你的例子(这是基于我对你的意图的理解):

/** @file: test.cpp */
#include <utility>
#include <type_traits>

template <typename T>
struct S {
  S() : t(0)  { };

  template <typename U>
  void operator()(U &&rrU) {
    static_assert(std::is_same<T,U>::value, "typename U must be equal to typename T"); 
    t = rrU; 
  }

  T t;
};

int main() {
  S<int> s;

  int a = 10;
  s(std::move(a));
#ifdef RAISES_ERROR
  double b = 10.0;
  s(std::move(b));
#endif
  return (0);
}

这可以通过两种方式编译:

g++ -std=c++11 test.cpp

编译好,第二种情况引发编译错误(这就是你想要的吗?),但错误可以解释清楚:

g++ -std=c++11 -DRAISES_ERROR test.cpp

test.cpp: In instantiation of ‘void S<T>::operator()(U&&) [with U = double; T = int]’:
test.cpp:26:17:   required from here
test.cpp:12:5: error: static assertion failed: Error
     static_assert(std::is_same<T,U>::value, "typename U must be equal to typename T");
     ^