Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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 - Fatal编程技术网

C++ 禁用函数基于参数的模板参数推断的更好方法?

C++ 禁用函数基于参数的模板参数推断的更好方法?,c++,templates,C++,Templates,以下是我想做的: template <typename T> void f(DisableDeduction<T> obj) {std::cout << obj;} // Here DisableDeduction<T> aliases T, but in a such way // that would prevent compiler from deducing T based // on provided argument. /* ...

以下是我想做的:

template <typename T> void f(DisableDeduction<T> obj) {std::cout << obj;}
// Here DisableDeduction<T> aliases T, but in a such way
// that would prevent compiler from deducing T based
// on provided argument.

/* ... */

f<int>(1); // Works.
f(1); // Error, can't deduce template parameter based on argument.
这就是我目前实现它的方式:

template <typename T> struct DisableDeduction_Internal {using type = T;};
template <typename T> using DisableDeduction = typename DisableDeduction_Internal<T>::type;
它的工作原理与前面描述的一样完美,但它引入了一种额外的助手类型


但是我能在没有额外类型的情况下获得相同的结果吗?

您可以通过将T放在不可推断的上下文中,放在::的左边,然后使用from来实现

例如:

template <typename T> void f(typename std::common_type<T>::type obj) {std::cout << obj;}

std::enable_if_t?@Jarod42,您介意用一个工作示例将其转化为一个答案吗?谢谢。在C++14中,typename std::common_type::type可以是std::common_type,\t,在我看来,std::common_type更简短、可读性更强。使用typedef时可读性更强,模板使用no_expert=typename std::common_type::type;